"Scrapped or attached views may not be recycled" 因为支持 lib 25.0.0
"Scrapped or attached views may not be recycled" since support lib 25.0.0
当我快速滚动列表时,所有 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));
}
还有其他人经历过这种行为吗?
为防止此问题导致崩溃,您需要从适配器调用 setHasStableIds(boolean)
并将参数作为 true 传递:
adapter.setHasStableIds(true);
说明:
当您调用 adapter.notifyDataSetChanged();
时出现问题
recyclerView
然后调用 detachAndScrapAttachedViews(recycler);
它暂时分离并废弃所有当前附加的子视图。视图将被废弃到给定的 Recycler
中。 Recycler
可能更愿意重复使用剪贴簿视图。
然后调用scrapOrRecycleView(recycler, (int) position, (View) child);
。此函数检查 "hasStableIds" 是真还是假。如果它是假的,那么你会得到以下错误:
"Scrapped or attached views may not be recycled."
稳定 ID 允许 View
(RecyclerView
、ListView
等)针对 notifyDataSetChanged
调用之间项目保持相同的情况进行优化。
hasStableIds() == true
表示项目 ID 在基础数据发生变化时是否稳定。
如果项目 ID 是稳定的,那么它可以被视图重用,即 "recycled" 使调用 notifyDataSetChanged()
后重新渲染的过程变得高效。如果项目 ID 不稳定,则无法保证该项目已被回收,因为无法跟踪它们。
注意:将 setHasStableIds()
设置为 true 并不是请求稳定 ID 的一种方式,而是告诉 Recycler/List/Grid 视图您正在提供上述稳定性。
如果您在 XML 中的 RecyclerView
上设置 android:orientation="horizontal"
,也会发生这种情况。删除它可以防止崩溃。
当我快速滚动列表时,所有 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));
}
还有其他人经历过这种行为吗?
为防止此问题导致崩溃,您需要从适配器调用 setHasStableIds(boolean)
并将参数作为 true 传递:
adapter.setHasStableIds(true);
说明:
当您调用 adapter.notifyDataSetChanged();
recyclerView
然后调用 detachAndScrapAttachedViews(recycler);
它暂时分离并废弃所有当前附加的子视图。视图将被废弃到给定的 Recycler
中。 Recycler
可能更愿意重复使用剪贴簿视图。
然后调用scrapOrRecycleView(recycler, (int) position, (View) child);
。此函数检查 "hasStableIds" 是真还是假。如果它是假的,那么你会得到以下错误:
"Scrapped or attached views may not be recycled."
稳定 ID 允许 View
(RecyclerView
、ListView
等)针对 notifyDataSetChanged
调用之间项目保持相同的情况进行优化。
hasStableIds() == true
表示项目 ID 在基础数据发生变化时是否稳定。
如果项目 ID 是稳定的,那么它可以被视图重用,即 "recycled" 使调用 notifyDataSetChanged()
后重新渲染的过程变得高效。如果项目 ID 不稳定,则无法保证该项目已被回收,因为无法跟踪它们。
注意:将 setHasStableIds()
设置为 true 并不是请求稳定 ID 的一种方式,而是告诉 Recycler/List/Grid 视图您正在提供上述稳定性。
如果您在 XML 中的 RecyclerView
上设置 android:orientation="horizontal"
,也会发生这种情况。删除它可以防止崩溃。