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

时间:2016-10-26 13:16:22

标签: 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));
        }

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

2 个答案:

答案 0 :(得分:11)

为防止此问题崩溃,您需要从适配器调用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 Views您提供上述稳定性。

答案 1 :(得分:0)

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