当我快速滚动列表时,所有的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允许ViewRecyclerViewListView等)在notifyDataSetChanged调用之间的项保持不变的情况下进行优化。
hasStableIds() == true指示在对基础数据进行更改时项ID是否稳定。
如果条目id是稳定的,那么它可以被视图重用,即“回收”,从而使调用notifyDataSetChanged()后的重新呈现过程高效。如果项目ID不稳定,则无法保证项目已被回收,因为无法跟踪它们。
注意:将setHasStableIds()设置为true并不是请求稳定id的方法,而是告诉recycler/list/grid视图您提供了上述稳定性。

07-24 19:47