android - 在顶部更新时 RecyclerView 崩溃

标签 android android-recyclerview recyclerview-layout

我的应用程序中有一个 RecyclerView 一切正常 我在滚动时看到最后一个项目 我正在向底部添加更多项目并且它工作正常。现在的问题是我有一个 Handler 每 5 秒运行一次并检查 Web 服务中是否有任何更新,如果有任何更新我只是将数据加载到RecyclerView 当我没有滚动 RecyclerView 但当我滚动它并调用 Handler 时它工作正常(因为它每 5 次调用一次秒)然后在更新顶部的 RecyclerView 时应用崩溃。

顶部的更新函数:

public void addOnTop(ArrayList<ItemPOJO> topItemList) {
    for (int i = topItemList.size() - 1; i >= 0; i--) {
        itemList.add(0, topItemList.get(i));
    }
    notifyItemRangeInserted(0, topItemList.size());
    notifyDataSetChanged();
}

这是错误日志:

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{419b8760 position=5 id=-1, oldPos=-1, pLpos:-1 no parent}
        at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:4214)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4345)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4326)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1955)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1364)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1327)
        at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1155)
        at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1012)
        at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1363)
        at android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:2227)
        at android.view.View.dispatchTouchEvent(View.java:7190)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2274)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2009)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023)
        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2280)
        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2023)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1931)
        at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1385)
        at android.app.Activity.dispatchTouchEvent(Activity.java:2396)
        at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:59)
        at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:59)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1879)
        at android.view.View.dispatchPointerEvent(View.java:7370)
        at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3182)
        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3127)
        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4164)
        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4143)
        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4235)
        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171)
        at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
        at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:163)
        at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4214)
        at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4254)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
        at android.view.Choreographer.doCallbacks(Choreographer.java:555)
        at android.view.Choreographer.doFrame(Choreographer.java:523)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreog

P.S.: com.android.support:recyclerview-v7:22.2.1 被使用

最佳答案

这个崩溃可能是因为 setViewHolderonBind 方法在更新你的列表(由适配器使用)时被调用,但是 notifyDataSetChanged() 尚未被调用。如果您在更新列表时滚动或快速浏览列表,通常会发生这种情况。

解决方法: 维护一个单独的 ItemPOJO 列表 (tempList) 并将 topData 附加到该列表中。 然后清除适配器使用的列表,用tempList设置适配器列表,调用notifyDataSetChanged()

关于android - 在顶部更新时 RecyclerView 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31603826/

相关文章:

android - 计算两次Android之间的时间

安卓喷气背包 : RecyclerView is not updating when LiveData is set

android - 如何在回收站 View 中显示不同尺寸的图像

android - 如何限制 RecyclerView 中的项目数?

android - 如何将提示属性转换为 ViewModel 中的观察项

java.lang.NullPointerException : Attempt to invoke virtual method 'java.lang.String com.solaris.timster.model.Post.getTitle()' 异常

java - 以编程方式将 .PSD 文件转换为 .JPEG/.PNG 文件

android - StaggeredGridLayoutManager 用于创建这样的 View

java - 为回收器 View 项目装饰线添加厚度

android - RecyclerView 不会变空