在滚动 RecyclerView 时出现异常:-“java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item p

Posted

技术标签:

【中文标题】在滚动 RecyclerView 时出现异常:-“java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 21”【英文标题】:On scroll the RecyclerView getting exception : -" java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 21" 【发布时间】:2018-03-23 03:23:46 【问题描述】:

我在我的应用程序中使用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:检测到不一致。无效的项目位置 21(offset:21).state:32 在 android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5546) 在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5482) 在 android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5478) 在 android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2215) 在 android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1542) 在 android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1502) 在 android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1316) 在 android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1061) 在 android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4769) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 在 android.view.Choreographer.doCallbacks(Choreographer.java:574) 在 android.view.Choreographer.doFrame(Choreographer.java:543) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 在 android.os.Handler.handleCallback(Handler.java:733) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:136) 在 android.app.ActivityThread.main(ActivityThread.java:5095) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602) 在 dalvik.system.NativeStart.main(Native Method)

有很多类似的问题,但我没有得到预期的结果。这是我在此处发布问题之前访问过的链接。1. First link2. Second link3. 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();
    



请帮我解决这个问题。谢谢

更新 我做了什么来解决这个冲突,我在加载数据时禁用了用户界面(显示一些进度条)。

【问题讨论】:

你的适配器在哪里? 你也需要看看吗??..我会照你说的发帖 是的,它会帮助我:D 请检查问题..我已经编辑它..让我知道 在连接到适配器和适配器内部之前检查您的数组列表大小 【参考方案1】:

我对“java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 6(offset:6).state”有同样的问题。这个崩溃是用 pullrefrash 显示的,当你有 loadmore 时,列表比你第一次加载的要多。然后你pulltorfrash新数据并清除旧列表数据,此时你适配器的数据大小不超过你的新数据大小。

【讨论】:

你可以试试这个方法:刷新时使用adapter.notifyDataChanged。加载更多数据时使用adapter.notifyItemRangeChanged(list.size,list.size);【参考方案2】:

尝试注释这行代码:

rvEmoji.setItemAnimator(new DefaultItemAnimator());

检查它现在是否有效。如果是这样,那么您面临的错误是因为启用了 PredictiveAnimations。要将您的代码与动画一起使用,您必须继承您正在使用的特定布局管理器并覆盖 supportsPredictiveItemAnimations() 方法并返回 false。

@Override 
public boolean supportsPredictiveItemAnimations()  
       return false; 

详细了解看here。

【讨论】:

以上是关于在滚动 RecyclerView 时出现异常:-“java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item p的主要内容,如果未能解决你的问题,请参考以下文章

Recyclerview cardview Onclick滚动时出现重复效果

滑动RecyclerView时出现异常: java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item posit

为啥尝试在编辑器窗口中进行垂直滚动时出现异常 InvalidOperationException: Stack empty.?

以编程方式设置滚动视图的布局参数时出现异常

滚动时将新项目添加到列表时出现数组索引超出范围异常

Recyclerview部分:调用notifyDataSetChanged()时出现IllegalStateException [重复]