android - Recycler view Array index out of bound Inconsistency Error while SwipeRefresh 和回收器同时滚动

标签 android android-recyclerview indexoutofboundsexception swiperefreshlayout

我正在使用 23.1.1 RecyclerView,当滑动刷新开始时,在这种情况下,当我滚动我的 RecyclerView 时,它会崩溃并给我错误

这是我的错误日志,

    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{39e0644b position=6 id=-1, oldPos=-1, pLpos:-1 no parent}
at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:4251)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4382)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4363)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1370)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1161)
at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1018)
at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1492)
at android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:2416)
at android.view.View.dispatchTouchEvent(View.java:8476)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2401)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2092)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2407)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2106)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2369)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1719)
at android.app.Activity.dispatchTouchEvent(Activity.java:2752)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:60)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2330)
at android.view.View.dispatchPointerEvent(View.java:8671)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4193)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4059)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3604)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:36

这些错误仅在我使用滑动刷新布局时发生。

在适配器的 onBindViewHolder 方法中,当最后一项可见时,我调用了一个加载更多数据的事件

@Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {


        if(position == data.size() -1 && data.size() >= AppConstants.LIST_PAGE_SIZE){

            EventBus.getDefault().postSticky(new LoadMoreDataEvent(getPageIndex()));
        }
}

更新:

清除列表后,当我尝试通知适配器时出现此错误,这是回收站 View 中的错误。我只是清除列表并设置适配器为 null 及其工作。

list.clear();
mAdapter.notifyDataSetChanged();

最佳答案

由于列表已被清除,因此在获得运行后台任务的正确位置时会出现问题,因此当您在 notifydatasetchange 之前清除回收 View 时不要使用它。使用这个:

mAdapter.notifyItemRangeInserted(0, YourArrayList.size()) 

代替

mAdapter.notifyDataSetChanged();

关于android - Recycler view Array index out of bound Inconsistency Error while SwipeRefresh 和回收器同时滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35355690/

相关文章:

java - SQL数据库 "create Tabe"

android - Intent 打开选项卡式 Activity 的特定选项卡

java - 具有不同表达式类型的嵌套开关: ArrayIndexOutOfBoundsException -4

android - WebView 的 loadData() 方法出现问题

android - 如何使用一个 Intent 访问android中的照片和相机

android - 无法创建所需的布局 xml (Android)

android - IntelliJ 预览版 RecyclerView API 级别 25

android - onCheckedChanged 自动调用

JavaFX ComboBox 更改值导致 IndexOutOfBoundsException

java - Android Realm Java 0.82.1 ArrayIndexOutOfBoundsException