"自从支持lib 25.0.0以来,"可能无法回收废弃或附加的视图"

sat*_*iva 7 android android-support-library

当我快速滚动列表时,所有的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));
        }
Run Code Online (Sandbox Code Playgroud)

有没有其他人经历过这种行为?

Sab*_*rya 11

要防止此问题崩溃,您需要setHasStableIds(boolean)从适配器调用并将参数传递为true:

adapter.setHasStableIds(true);
Run Code Online (Sandbox Code Playgroud)

说明:调用时出现问题 adapter.notifyDataSetChanged();

recyclerView随后调用detachAndScrapAttachedViews(recycler);它暂时分离和废料所有当前连接子视图.视图将被废弃到给定的视图中Recycler.在Recycler可能宁愿再利用报废的意见.

然后scrapOrRecycleView(recycler, (int) position, (View) child);被叫.此函数检查"hasStableIds"是true还是false.如果为false,则会出现以下错误:

"废弃或附加的视图可能无法回收."

稳定的ID允许View(RecyclerView,ListView等)优化notifyDataSetChanged调用之间项目保持不变的情况. hasStableIds() == true指示项目ID是否在对基础数据的更改中保持稳定.

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

注意:设置setHasStableIds()为true不是请求稳定ID的方法,而是告诉Recycler/List/Grid Views您提供所述稳定性.