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

滚动显示RecyclerView获取异常:-“java.lang.IndexOutOfBoundsException:检测到不一致。无效项目位置21”

弓晔
2023-03-14

我在我的应用程序中使用带有Sqlite回收器视图。因为我已经从SQlite加载了回收器视图,并且在后台调用服务之后,尝试通过通知RecyclView通过通知fyDataSetChanged()方法,但在滚动RecyclView时得到意外的异常(当RecyclView正在更新或通知时)。

请检查我的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:检测到不一致。项目位置21无效(偏移量:21)。state:32 at Android . support . V7 . widget . recycler view $ recycler . trygetviewforpositionbydadline(recycler view . Java:5546)at Android . support . V7 . widget . recycler view $ recycler . getviewforposition(recycler view . Java:5482)at Android . support . V7 . widget . recycler view $ recycler . getviewforposition(recycler view . Java:5478)at Android . support . V7 . widget . linearlayoutmanager $ lay

有很多简单的问题,但我没有得到预期的结果。这是我在这里发布问题之前访问过的链接。
1. 第一个链接
2.第二个链接
3.第三个链接
4.第四个链接
5.第五个链接
6.第六个链接

我已经访问了所有的链接,并尝试了他们的最佳解决方案,但它不是为我工作..

我使用以下gradle版本的RecyclerView

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();
    }


}

请帮助我从问题中解脱出来。谢谢

更新< br >为解决此冲突,我在加载数据时禁用了用户界面(显示一些进度条)。


共有2个答案

姚文轩
2023-03-14

尝试注释这行代码:

rvEmoji.setItemAnimator(new DefaultItemAnimator());

检查它现在是否工作。如果是这样,那么你所面临的错误是因为预测动画被启用。要将您的代码与动画一起使用,您必须将您正在使用的特定布局管理器子类化,并覆盖supportspredictiveitemnanimations()方法并返回false。

@Override 
public boolean supportsPredictiveItemAnimations() { 
       return false; 
}

如需详细了解,请查看此处。

姜淇
2023-03-14

我对“Java . lang . indexoutofboundsexception:检测到不一致”也有同样的问题。无效的项目位置6(偏移量:6)。国家”。当你加载更多的时候,列表比你第一次加载的时候多,这个崩溃显示为pullrefrash。然后你拉新的数据并清除旧的列表数据,这时你适配器的数据大小不超过你新的数据大小。

 类似资料:
  • 你们能帮我做这个吗 这是我添加片段的代码 但当我从添加的片段中按back时,我出现了这个错误,我的应用程序崩溃了。 为什么会这样?请帮忙。我正在使用两个片段。产品列表fragent和产品详细信息片段

  • 我已经开始在Crashlytics上报道这次坠机事件。我不知道如何复制它,但它似乎都是内部的代码。我认为这来自于我的<代码>回收视图</代码>它从未真正改变过。用户可以刷新它,但随后会替换所有项,并调用。

  • 我们的 QA 检测到一个错误:发生了以下与 RecyclerView 相关的崩溃:' Java . lang . indexoutofboundsexception:检测到不一致。无效的项目位置2(偏移量:2)。状态:3 一个残酷的解决方法可能是在异常发生时捕获它,并从头开始重新创建RecycleverView实例,以避免处于损坏状态。 但是,如果可能的话,我想更好地理解这个问题(也许从根源上修复

  • 我们的QA检测到了一个bug:当旋转Android设备(Droid Turbo)时,发生了以下与RecyclerView相关的崩溃: java.lang.IndexOutOfBoundsException:检测到不一致。无效的物料位置%2(偏移量:%2)。状态:%3 对我来说,这看起来像是RecyclerView内部的一个内部错误,因为我想不出这是由我们的代码直接导致的任何方式... 有人遇到过这

  • 致命异常:检测到java.lang.IndexOutOfBoundsException不一致。无效的物料位置5(偏移量:5)。状态:24 这种撞车的情况太多了!!! 我在布料上弄到的。 DateList是涉及RecyclerView片段: callToServer(带有假输入)首先清除键列表,然后填充它。几毫秒后,将调用callToServer(具有true输入)来再次清除keyList,并填充新

  • 我正在尝试删除我的< code > recycle view 中的第一个项目。使用livedata和diffutil监控对列表的更改。仅当删除< code > recycle view 中的第一个项目(第0个索引)时,才会发生崩溃。这似乎与其他相关问题相似。快速滚动时不会出现此问题,等等。Ot仅在移除第0个位置的项目时发生。项目本身将从数据库中删除。但是应用程序崩溃了。我尝试从< code > r