网站源代码怎么放入 dede网站后台,好男人hd免费观看,中国十大电商公司,枸橼酸西地那非片是什么点击跳转Unity3D特效百例点击跳转案例项目实战源码点击跳转游戏脚本-辅助自动化点击跳转Android控件全解手册点击跳转Scratch编程案例点击跳转软考全系列
#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧#xff0c;以及各种资源分享Unity3D特效百例点击跳转案例项目实战源码点击跳转游戏脚本-辅助自动化点击跳转Android控件全解手册点击跳转Scratch编程案例点击跳转软考全系列
关于作者 专注于Android/Unity和各种游戏开发技巧以及各种资源分享网站、工具、素材、源码、游戏等 有什么需要欢迎底部卡片私我交流让学习不再孤单。 实践过程
问题
近来项目里RecyclerView 更新数据偶尔出现 crash错误日志如下 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{2064e5c6 position2 id-1, oldPos2, pLpos:-1 scrap [attachedScrap] tmpDetached no parent}at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:4505)at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4636)at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4617)at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994)at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390)at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353)at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574)at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:2979)at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2904).....这类问题出现的原因是数据变化和更新不同步造成的不如你 clear 了然后又等接口请求完毕 add 了只进行了一次 adapter 更新再比如你在滑动的过程中数据源被你的某个业务逻辑改变了数据。 总之就是突出一个思想数据的任何一次变动没有及时进行 adapter 的更新造成的。 遇到这类错误 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder通过查阅 Stackoverflow 和资料总结了如下情况和解决方法
解决
方法一
自己写一个继承 LinearLayoutManager 的包装类在 onLayoutChildren() 方法里 try-catch 捕获该异常。
Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {try {super.onLayoutChildren(recycler, state);} catch (IndexOutOfBoundsException e) {e.printStackTrace();}
}方法二
在进行数据移除和数据增加时务必要保证 RecyclerView 的 Adapter 中的数据集和移除添加等操作后的数据集保持一致
这里前者是在该 Adapter 内部不妨叫做内部数据集后者是开发人员传过给 Adapter 的不妨叫外部数据集。更新RecyclerView 数据时需要保证外部数据集和内部数据集实时保持一致。
外部数据集同步到内部数据集使用如下的方法
notifyItemRangeRemoved();notifyItemRangeInserted();notifyItemRangeChanged();notifyDataSetChanged();
这里对 notifyDataSetChange() 做些说明 使用该方法的更新内部数据集没有默认的动画效果同时更新数据的效率页不如上面的方法官方不推荐使用这种方式更新数据集。 Don’t call notifyDataSetChanged if you don’t have to.RecyclerView 的 Adapter 里发生异常的错误代码如下
public void notifyData(ListPoiItem poiItemList) {if (poiItemList ! null ) {mPoiItems.clear();mPoiItems.addAll(poiItemList);notifyItemRangeChanged(0, poiItemList.size());}
}错误分析 mPoiItems 是外部数据集对该外部数据集做了两个操作先移除数据然后添加数据之后 notify 数据集。这里添加数数据时 Adapter 的内部数据集内容还处在外部数据集移除数据之前造成了内部和外部数据集不一致。
这是一方面另一方面我使用了 notifyItemRangeChanged() 来更新数据如果 poiItemList 传过来的新数据和原来 mPoiItems 的数据数量不一致就会出现内部数据集和外部数据在同步后不一致从而报错。
修复后运行正常的代码如下
public void notifyData(ListPoiItem poiItemList) {if (poiItemList ! null) {int previousSize mPoiItems.size();mPoiItems.clear();notifyItemRangeRemoved(0, previousSize);mPoiItems.addAll(poiItemList);notifyItemRangeInserted(0, poiItemList.size());}
}修复分析
每一次对外部数据集做改动时都需要紧接着主动对外部数据集和内部数据集做一次同步操作动画效果也得到了保持使用方法三动画效果缺失
方法三
使用 notifyDataSetChanged 同步外部数据集和内部数据集。该方法简单但是失去了动画效果并且更新数据的性能低。
use notifyDataSetChanged() will avoid this crash, but it will kill Animation and Performance.另外如果对外部数据集做了二次以上的操作却只调用notifyDataSetChanged同步一次也很有可能会报上文所示的错误。
其他 作者小空和小芝中的小空 转载说明-务必注明来源https://zhima.blog.csdn.net/ 这位道友请留步☁️我观你气度不凡谈吐间隐隐有王者霸气日后定有一番大作为旁边有点赞收藏今日传你点了吧未来你成功☀️我分文不取若不成功⚡️也好回来找我。 温馨提示点击下方卡片获取更多意想不到的资源。