当我快速滚动列表时,所有的recyclerviews有时会崩溃,因为我已经更新以支持lib 25.0.0。没有布局动画师,一切正常,支持lib< 25。
在RecyclerView中抛出异常,因为holder.itemView.getparent()不为null
if (holder.isScrap() || holder.itemView.getParent() != null) {
throw new IllegalArgumentException(
"Scrapped or attached views may not be recycled. isScrap:"
+ holder.isScrap() + " isAttached:"
+ (holder.itemView.getParent() != null));
}
有没有其他人经历过这种行为?
答案 0 :(得分:11)
为防止此问题崩溃,您需要从适配器调用setHasStableIds(boolean)
并将参数传递为true:
adapter.setHasStableIds(true);
说明:
致电adapter.notifyDataSetChanged();
recyclerView
然后调用detachAndScrapAttachedViews(recycler);
它暂时分离并废弃所有当前附加的子视图。视图将被废弃到给定的Recycler
中。 Recycler
可能更愿意重复使用剪贴画视图。
然后调用scrapOrRecycleView(recycler, (int) position, (View) child);
。此功能检查" hasStableIds"是真还是假。如果它为false,则会出现以下错误:
"废弃或附加的视图可能无法回收。"
稳定ID允许View
(RecyclerView
,ListView
等)针对notifyDataSetChanged
次来电之间的项目保持不变的情况进行优化。
hasStableIds() == true
表示项目ID在对基础数据的更改中是否稳定。
如果项目ID是稳定的,那么它可以被视图重用,即"再循环"在调用notifyDataSetChanged()
之后进行重新渲染的过程。如果商品ID不稳定,则无法保证该商品已被回收,因为无法跟踪它们。
注意:将setHasStableIds()
设置为true不是请求稳定ID的方法,而是告诉Recycler / List / Grid Views您提供上述稳定性。
答案 1 :(得分:0)
如果您在XML中android:orientation="horizontal"
上设置RecyclerView
,也会发生这种情况。删除它可以防止崩溃。