gpt4 book ai didi

android - 使用 RecyclerView 适配器时 ViewHolders 未回收

转载 作者:搜寻专家 更新时间:2023-11-01 07:45:46 24 4
gpt4 key购买 nike

单击项目转到详细信息时我有一个提要,在此期间 FeedFragment 分离并推送 DetailsFragment。返回时,我们正在检查适配器是否不为空。

    if (adapter == null) {
adapter = createAdapter();
}

if (recyclerView.getAdapter() == null) {
recyclerView.setAdapter(adapter);
}

问题是每次去细节和返回时重用适配器时,ViewHolders 的数量加倍。它可以继续,直到卡住应用程序并发生 OOM。

问题是为什么会这样?适配器不应该从 recyclerView 分离并且所有项目都应该被回收吗?

附言返回时创建新适配器时不会出现此问题。

最佳答案

我认为您正在泄漏 RecyclerView(以及它们引用的所有内容,包括 View 池)

RecyclerView 在适配器 (Adapter.registerAdapterDataObserver) 上注册自己,但它仅在设置新适配器时注销(它从旧适配器注销并在新适配器上注册) ).因此,适配器会保留对先前 RecyclerView 实例的引用,以防止它们被垃圾回收。

我能想到的解决方案是:

  • Fragment.onDestroyView() 中从适配器中手动注销 RecyclerView。我知道的唯一方法是调用 RecyclerView.setAdapter(null)

  • 每次都使用一个新的适配器。它应该是相对轻量级的对象,至少与 RecyclerView 本身相比。

此外,如果您想避免每次都重新创建一组 ViewHolders,可以共享一个 RecycledViewPoolRecyclerView 实例之间。 (我刚刚发现这个,我不确定它应该如何使用)

关于android - 使用 RecyclerView 适配器时 ViewHolders 未回收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44648308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com