java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positiongViewHolder

今天调试项目的时候报的问题:究其原因是因为adapter中的数据与fragment中的数据不一致导致,一般都是代码的执行顺序导致。

以下的代码报错:

int dataSize = riskDatas.size();
            if (dataSize > 0) {
          //1 riskDatas.clear(); requireActivity().runOnUiThread(
new Runnable() { @Override public void run() {
//2 navLeftAdapter.notifyItemRangeRemoved(
0, riskDatas.size()); //==>dataSize估计也行。 }); }
        //3 String ids
= navitem.getQuestionids(); List<String> idsArray = Arrays.asList(ids.split(",")); for (RiskPointItem item : tmpRiskPointItems.getRiskPointList()) { String id = item.getId() + ""; if (idsArray.contains(id)) { riskDatas.add(item); } } if (riskDatas.size() > 0) { riskDatas.get(0).setSelected(true); } }

上面代码的执行顺序是:1、2、3,其实不是这样的,是1、3、2这样执行的。

上面代码:

1、view中的逻辑数据清空了,实际recycleview中的adapter中数据没有清空。

2、将新的数据加入到了逻辑数据集中,但是adapter中的数据并没有变化(还是之前的状态),再去按现有逻辑中的数据清空现有的数据,当然会不一致。

解决:

只要将3放到2的下面即可

int dataSize = riskDatas.size();
            if (dataSize > 0) {
//1 riskDatas.clear();           //2 requireActivity().runOnUiThread(
new Runnable() { @Override public void run() {
//2 navLeftAdapter.notifyItemRangeRemoved(
0, dataSize);               //3 String ids = navitem.getQuestionids(); List<String> idsArray = Arrays.asList(ids.split(",")); for (RiskPointItem item : tmpRiskPointItems.getRiskPointList()) { String id = item.getId() + ""; if (idsArray.contains(id)) { riskDatas.add(item); } } if (riskDatas.size() > 0) { riskDatas.get(0).setSelected(true); } } }); }

说明:这样就可以按1、2、3来执行了,一般是单步调试的时候就会发现问题。

 

posted @ 2022-08-17 16:43  jiduoduo  阅读(2610)  评论(0编辑  收藏  举报