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来执行了,一般是单步调试的时候就会发现问题。
道法自然