java - 在滚动 RecyclerView 时出现异常 : -"java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 21"

标签 java android android-recyclerview

我在我的应用程序中使用 RecyclerViewSqlite。 因为我已经从 SQlite 加载了 RecyclerView 并且在后台调用服务后尝试通过 notifyDataSetChanged() 通知 RecyclerView 方法,但在滚动 RecyclerView 时出现意外异常(当 RecyclerView 正在更新或通知时)。​​

请检查我的 setAdapter(),我正在使用它通知并在 RecyclerView 上设置适配器

  private void setAdapter() {

        if (adapter == null) {
            adapter = new EmojiAdapter(stickerArrayList, getActivity(), "Sticker", stickerIdArrayList);
            RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
            rvEmoji.setLayoutManager(mLayoutManager);
            rvEmoji.setItemAnimator(new DefaultItemAnimator());
            rvEmoji.setAdapter(adapter);
        } else {

            adapter.notifyDataSetChanged();

        }

    }

我已经尝试了所有的 RecyclerView.stopScroll(), RecyclerView.getRecycledViewPool().clear() 但问题不是短路

异常

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 21(offset:21).state:32 at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5546) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5482) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5478) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2215) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1542) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1502) at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1316) at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1061) at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4769) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) at android.view.Choreographer.doCallbacks(Choreographer.java:574) at android.view.Choreographer.doFrame(Choreographer.java:543) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5095) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) at dalvik.system.NativeStart.main(Native Method)

有很多类似的问题,但我没有得到预期的结果。这是我在此处发布问题之前访问过的链接。
1. First link
2. Second link
3. Third link
4. Forth link
5. Fifth link
6. Sixth link

我已经访问了所有链接并尝试了他们最好的解决方案,但它对我不起作用..

我正在为 RecyclerView 使用以下 gradle 版本

compile 'com.android.support:recyclerview-v7:26.+'

请检查我正在使用的适配器类如下:-

public class EmojiAdapter extends RecyclerView.Adapter<EmojiAdapter.MyViewHolder> {

    private Activity activity;
    private HashMap<String, ArrayList<EmojiBean>> arrayList = new HashMap<>();
    private String sticker_emoji;
    private ArrayList<String> keyArrayList = new ArrayList<>();

    public class MyViewHolder extends RecyclerView.ViewHolder {

        private RecyclerView rvItemCreation;
        private TextView txtStickerName, txtBy, txtCreator;
        private ImageView imgForward, imgDownload;

        private MyViewHolder(View view) {
            super(view);

            rvItemCreation = (RecyclerView) view.findViewById(R.id.rvItemCreation);
            txtStickerName = (TextView) view.findViewById(R.id.txtStickerName);
            txtBy = (TextView) view.findViewById(R.id.txtBy);
            txtCreator = (TextView) view.findViewById(R.id.txtCreator);
            imgForward = (ImageView) view.findViewById(R.id.imgForward);
            imgDownload = (ImageView) view.findViewById(R.id.imgDownload);

            txtStickerName.setTypeface(Constant.setCustomFont(activity, "Montserrat-SemiBold.otf"));
            txtBy.setTypeface(Constant.setCustomFont(activity, "Montserrat_Regular.otf"));
            txtCreator.setTypeface(Constant.setCustomFont(activity, "Montserrat_Regular.otf"));

        }
    }


    public EmojiAdapter(HashMap<String, ArrayList<EmojiBean>> arrayList, Activity activity, String sticker_emoji, ArrayList keyArrayList) {
        this.arrayList = arrayList;
        this.activity = activity;
        this.sticker_emoji = sticker_emoji;
        this.keyArrayList = keyArrayList;


    }


    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.my_media_item, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {


        if (sticker_emoji.equalsIgnoreCase("Sticker")) {
            holder.imgForward.setImageResource(R.drawable.forward_icon);
        } else {
            holder.imgForward.setImageResource(R.drawable.delete_icon);
        }


        if (arrayList.size() > position) {
            MyCreationItemAdapter mAdapter = new MyCreationItemAdapter(arrayList.get(keyArrayList.get(position)), activity);
            RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(activity, LinearLayoutManager.HORIZONTAL, false);
            holder.rvItemCreation.setLayoutManager(mLayoutManager);
            holder.rvItemCreation.setItemAnimator(new DefaultItemAnimator());
            holder.rvItemCreation.setAdapter(mAdapter);
        }


    }

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


}

请帮我解决问题。谢谢

Update
What i have done to resolve this conflict that I have done disable user interface(Show some progress bar) while loading the data.

最佳答案

我对“java.lang.IndexOutOfBoundsException:检测到不一致。无效的项目位置 6(offset:6).state”有同样的问题。这个崩溃是用 pullrefrash 显示的,当你加载更多时,列表比你第一次加载的多。然后你 pulltorfrash 新数据并清除旧列表数据,此时你适配器的数据大小不超过你的新数据大小。

关于java - 在滚动 RecyclerView 时出现异常 : -"java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 21",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46688435/

相关文章:

android - 模拟来自 onitemclick 的点击

java - 我有一个用作搜索栏的 editText,如果用户没有在搜索栏上输入任何内容,我该如何隐藏 recyclerView 项目

android - 如何检查我的 RecycleView notifyDataSetChanged() 何时完成?

java - Android 构建失败 com.android.dex.DexException : Multiple dex files define Landroid/support

java - java中的MaskFormatter

android - Webview 在 Android 4.0+ 中无法正确显示表格

android - 测试 Android fragment

java - 在 Camera Intent 后更新 RecyclerView.Adapter

java - java中如何将String类型转换为Class类型

java - 如何设置折线图中的 "LOADING..."标签?