当前位置: 首页 > 知识库问答 >
问题:

在RecolyerView中检测到不一致,如何在滚动时更改RecolyerView的内容

岳君之
2023-03-14

我正在使用recyclerview显示项目的名称。我的行包含单个textview。项名存储在list mitemlist 中。

若要更改RecolyerView的内容,我将替换MitemList中的字符串,并在RecolyerViewAdapter上调用NotifyDataSetChanged()。

但是,如果我试图在RecyclerView滚动时更改MitemList的内容,有时它会给我java.lang.IndexOutOfBoundsException:Inconsistency Detection。无效的项目位置157(偏移量:157)。状态:588

如果mitemlist的大小比以前小,就会发生这种情况。那么,更改RecyclerView内容的正确方法是什么?这是recyclerview中的bug吗?

以下是异常的完整堆栈跟踪:

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 157(offset:157).state:588
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3300)
        at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3258)
        at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1803)
        at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1302)
        at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1265)
        at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1093)
        at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:956)
        at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:2715)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
        at android.view.Choreographer.doCallbacks(Choreographer.java:555)
        at android.view.Choreographer.doFrame(Choreographer.java:524)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)
        at android.os.Handler.handleCallback(Handler.java:615)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4921)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
        at dalvik.system.NativeStart.main(Native Method)
private static class FileListAdapter extends RecyclerView.Adapter<FileHolder> {
    private final Context mContext;
    private final SparseBooleanArray mSelectedArray;
    private final List<String> mList;

    FileListAdapter(Context context, List<String> list, SparseBooleanArray selectedArray) {
        mList = list;
        mContext = context;
        mSelectedArray = selectedArray;
    }


    @Override
    public FileHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

        View view = LayoutInflater.from(viewGroup.getContext()).inflate(
                R.layout.file_list_item, viewGroup, false);

        TextView tv = (TextView) view
                .findViewById(R.id.file_name_text);
        Typeface font = Typeface.createFromAsset(viewGroup.getContext().getAssets(),
                viewGroup.getContext().getString(R.string.roboto_regular));
        tv.setTypeface(font);

        return new FileHolder(view, tv);
    }

    @Override
    public void onBindViewHolder(FileHolder fileHolder, final int i) {

        String name = mList.get(i);

        // highlight view if selected
        setSelected(fileHolder.itemView, mSelectedArray.get(i));

        // Set text
        fileHolder.mTextView.setText(name);
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }
}

private static class FileHolder extends RecyclerView.ViewHolder {

    public final TextView mTextView;

    public FileHolder(View itemView, TextView tv) {
        super(itemView);
        mTextView = tv;
    }
}

共有1个答案

厍建义
2023-03-14

编辑:这个错误现在已经修复了,如果您仍然得到相同的异常,请确保您只是从主线程更新您的适配器数据源,然后调用相应的适配器notify方法。

老答案:这似乎是recyclerview中的一个bug,这里和这里都有报告。希望它能在下一个版本中得到修正。

 类似资料:
  • 我的应用程序中有回收器视图。UI类似于Google Play Store应用程序。它有两个视图寻呼机和项目的列表和网格以交替的方式。所有数据都是从web服务中提取的,并在两个API调用中被分叉。列表和网格的数据是从另一个API填充的。问题是,当我快速滚动recyclerview时,我会遇到这种崩溃。滚动recyclerview时,用于在列表/网格中加载数据的API调用来自。阅读了许多关于这个主题的

  • 我有一个recyclerview有不同的肖像和景观布局。当活动开始时,不管方向如何,recyclerview都会填充数据。但如果改变了方向,则不会显示任何数据。并且没有显示相应的方向变化的数据。

  • 我有一个电影应用程序,其中一个名为“现在放映”的列表项将打开一个新的活动,以加载从我的firebase电影数据库中提取的电影列表。但是,当我按下“现在显示”时,app就会崩溃。这是我的密码 这就是我得到的错误

  • 我使用这段代码在滚动到部分时突出显示导航栏。当我滚动到某个分区时,是否可以立即更改地址栏中的URL?有人能帮我吗? 提前感谢

  • 我用最小SDK 15和目标23构建了一个应用程序,我在中有不同的视图。Apps在android版本=>5.0上运行良好,但在android版本<5.0上崩溃,出现以下错误消息 下面是我的的代码: list_item_text.xml Build.Gradle

  • SeriesListener 序列rvadapter 描述活动性 2018-12-02 17:44:33.663 6704-6704/com.example.forev.neizledim E/AndroidRuntime:致命异常:主进程:com.example.forev.neizledim,pid:6704 java.lang.nullpointerexception:尝试在com.exam