"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 允许 ViewRecyclerViewListView 等)针对 notifyDataSetChanged 调用之间项目保持相同的情况进行优化。 hasStableIds() == true 表示项目 ID 在基础数据发生变化时是否稳定。

如果项目 ID 是稳定的,那么它可以被视图重用,即 "recycled" 使调用 notifyDataSetChanged() 后重新渲染的过程变得高效。如果项目 ID 不稳定,则无法保证该项目已被回收,因为无法跟踪它们。

注意:将 setHasStableIds() 设置为 true 并不是请求稳定 ID 的一种方式,而是告诉 Recycler/List/Grid 视图您正在提供上述稳定性。

如果您在 XML 中的 RecyclerView 上设置 android:orientation="horizontal",也会发生这种情况。删除它可以防止崩溃。