【问题标题】:RecyclerView java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position when resume from added fragmentRecyclerView java.lang.IndexOutOfBoundsException:检测到不一致。从添加的片段恢复时项目位置无效
【发布时间】:2016-07-15 12:12:22
【问题描述】:

你们能帮帮我吗

这是我添加片段的代码

mRecyclerView.addOnItemTouchListener(
    new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            if (!IsScrolling) {
                Fragment fragment = new ProductInfoFragment();
                    Bundle bundle = new Bundle();
                    bundle.putString("prodID", mItems.get(position).getproductID());
                    bundle.putString("catName", catName);
                    fragment.setArguments(bundle);
                    FragmentManager fragmentManager = getActivity().getFragmentManager();
                    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
                                        fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                                        fragmentTransaction.add(R.id.fragmentContainer, fragment, "ProuctInfoFragment");
                                        fragmentTransaction.addToBackStack(null);
                                        fragmentTransaction.commit();
                                        mItems.clear();
                                    }

                                }

                            })
                    );

但是当我从添加的片段返回时,我收到了这个错误并且我的应用程序崩溃了。

FATAL EXCEPTION: main Process: com.tiseno.poplook, PID: 2617
 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 5(offset:5).state:9
      at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4401)
      at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4359)
      at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1961)
      at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:438)
      at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1333)
      at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1161)
      at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1018)
      at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:3807)
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
      at android.view.Choreographer.doCallbacks(Choreographer.java:670)
      at android.view.Choreographer.doFrame(Choreographer.java:603)
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
      at android.os.Handler.handleCallback(Handler.java:739)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:224)
      at android.app.ActivityThread.main(ActivityThread.java:5514)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

为什么会这样?请帮忙。我使用两个片段。产品列表片段和产品详细信息片段

【问题讨论】:

  • 请格式化您的问题 - 在每行插入 4 个空格以使其显示为代码
  • 为什么有人反对我的问题。悲惨的生活..
  • 不是我,我的朋友,我只是在审核队列中工作,没有投票。描述他们在否决投票时看到的问题是一种很好的做法,很抱歉在这里没有完成。
  • 去掉了不必要的空格,使代码能够正确缩进,并有助于其他人浏览和回答。

标签: android android-recyclerview


【解决方案1】:

您在调用mItems.clear(); 时未通知RecyclerView 的适配器数据中的某些内容已更改。 每次更改适配器使用的数据后,您需要调用adapter.notifyDataSetChanged();

this

【讨论】:

  • 天哪。为什么我没有看到。我已经尝试了一天来找出原因。 =.= 谢谢马尔默。你是最棒的!!
  • @Tiseno:你应该把答案标记为正确的,它也为我解决了,也别忘了投票。
  • 谢谢你,我花了 3 天时间试图修复它,它就在我面前。
  • 为我工作。谢谢。
  • 对我来说,将 supportsPredictiveItemAnimations 覆盖为 false 未解决异常,但此解决方案解决了,谢谢。
【解决方案2】:

试试这个

我遇到了同样的问题,当您清除列表时,您必须通知适配器,因为每次您更改列表并且适配器包含旧列表,因此您必须在清除列表后通知适配器,然后再添加新列表适配器中的项目

  1. 在你的类开始时创建数据成员的实例

    ArrayList<HashMap<String,String>> yourarraylist =new ArrayList<>();
    Youradaptername instance;
    
  2. 清除列表后通知适配器

     yourarraylist .clear();
     instance.notifyDataSetChanged();
    

【讨论】:

    【解决方案3】:

    问题可能与适配器有关。如果您在适配器构造函数中使用setHasStableIds(true);,则需要确保您使用的是stable ids

    确保在适配器中正确覆盖 getItemId。 应该是:

    @Override
    public long getItemId(int position) {
       return yourList == null ? 0 : yourList.get(position).getId();
    }
    

    而不是

    @Override
    public long getItemId(int position) {
         return position;
    }
    

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 2017-09-30
      • 2020-01-23
      • 2015-08-08
      • 2018-12-04
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多