当我快速滚动列表时,所有的recyclerviews有时都会崩溃,因为我已经更新到支持lib 25.0.0。没有布局动画和一切工作正常,支持库在RecyclerView中引发异常,因为holder.itemView.getParent()不为空
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));
}
还有其他人经历过这种行为吗?
最佳答案
要防止此问题导致崩溃,需要从适配器调用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视图您提供了上述稳定性。