【问题标题】:Android RecyclerView: IndexOutOfBoundsException: Inconsistency detectedAndroid RecyclerView:IndexOutOfBoundsException:检测到不一致
【发布时间】:2017-11-10 21:46:46
【问题描述】:

我的 RecyclerView 有问题,我了解到 here 该错误已修复,我应该确保在主线程上插入数据并调用适当的通知。我这样做了,但我仍然收到此异常。

onLoadFinisher 方法(我正在使用加载器加载更多数据)

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data)
{
    switch (loader.getId())
    {
        case UP_LOADER_ID:
            Log.d("Adapter", "Thread: "+Thread.currentThread().getName());
            days.put(firstDate, data);
            notifyItemRangeInserted(0, data.getCount()+1);
            loadingUp = false;
            break;

        case DOWN_LOADER_ID:
            days.put(lastDate, data);
            notifyItemRangeInserted(getItemCount(), data.getCount()+1);
            loadingDown = false;
            break;

        default:
            throw new IllegalArgumentException("Unknown loader id: " + loader.getId());
    }
}

日志

I/OpenGLRenderer: Initialized EGL, version 1.4
D/Adapter: Thread: main
D/Adapter: Thread: main
D/Adapter: Thread: main
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: net.antilopa, PID: 6406
                  java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{fa4fb40 position=42 id=-1497045600000, oldPos=21, pLpos:21 scrap [attachedScrap] tmpDetached not recyclable(1) no parent}
                      at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5220)
                      at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5402)
                      at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5363)
                      at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5359)
                      at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2141)
                      at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1525)
                      at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1488)
                      at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:585)
                      at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3457)
                      at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3252)
                      at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3767)
                      at android.view.View.layout(View.java:16722)
                      at android.view.ViewGroup.layout(ViewGroup.java:5438)

【问题讨论】:

    标签: android android-recyclerview indexoutofboundsexception


    【解决方案1】:

    您可以将 getItemCount() 替换为 getItemCount()-1,因为 getItemCount() 返回计数,但索引值为 getItemCount()-1。 p>

     case DOWN_LOADER_ID:
            days.put(lastDate, data);
            notifyItemRangeInserted(data.getCount()-1, data.getCount()+1);
            loadingDown = false;
            break;
    

    【讨论】:

    • 谢谢,确实如此,但不幸的是我仍然遇到同样的异常
    • @F. Korf 你可以使用 data.getCount()-1 然后检查
    • 是的,我尝试使用 getCount()-1,但仍然遇到同样的异常。或者检查什么?
    猜你喜欢
    • 1970-01-01
    • 2014-04-29
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2016-12-10
    相关资源
    最近更新 更多