gpt4 book ai didi

Android RecyclerView 创建并绑定(bind)数据集更改的所有 View

转载 作者:可可西里 更新时间:2023-11-01 18:48:00 26 4
gpt4 key购买 nike

我有一个非常大的应用程序,我几乎在所有地方都使用了 RecylclerViews,我知道如何实现 RecyclerViews,我从来没有遇到过任何问题!但最近我在其中一个 RV 上遇到了一个非常严重的滞后,(让我向你保证我的 bindview 方法非常好,我在异步任务中加载了所有图像并且......),这是第一次显示 RV I收到 ANR!

经过几个小时的调试,我发现每次数据集发生变化时 (notifyDataset()),包括 RV 第一次填充时,所有 View 都会被创建和绑定(bind)(是的,就像 onCreateView( ) 被调用,这与 RecyclerView 的理念正好相反!)创建并绑定(bind)所有 View 后,应用程序开始正常运行,我的意思是不再需要 onCreateView() 和 onBindView() 调用,没有任何延迟。

我知道很难找到原因,但我想也许有一个明显的设置或......导致这个或 SO 用户过去的一些经验可能对我有帮助。


编辑

显然原因是由于我的 XML 以及我如何使 RV 填充自由区域,当我将它的高度设置为指定值(例如 400 dp)时一切正常,但如果我使用 LinearLayout 和layout_weight 或对 RelativeLayout 执行相同操作(设置在顶部对齐元素下方和底部对齐元素上方)会重现该问题。

所以我可以说的是,当需要动态计算 RV 的高度时会发生这个问题,我猜它会创建所有子项来计算它的高度,这显然是支持库 (com.android) 中的错误.support:recyclerview-v7:23.4.0 当时)

有人有解决方法吗?或者也许可以告诉我我的错误?


解决方案

为 future 的谷歌人

似乎解决方案是在 LayoutManager 上使用 setAutoMeasureEnabled(false);。此方法已在支持库的 23.2.0 版本中引入,应该有助于将 wrap_content 用作 RV 项目的布局参数,无论如何,我用这种方法克服了我的问题,并且毫无问题地将 wrap_content 用于我的项目高度,

最佳答案

onBindViewHolder 将被调用以显示 View 。第一次设置适配器 onBindViewHolder() 时不会被调用 200 次。只会针对可见的项目数调用它。 Fox 示例,如果有 4 个项目可见,则 onBindViewHolder 将被调用 4 次,当您滚动时,将根据需要绘制的项目数量调用 onBindViewHolder。

如果某些数据正在更改并且您使用 notifyDatasetChanged() 则所有 View 都将被重绘。如果您正在插入一个元素并想要刷新适配器,请使用类似

的东西
adapter.notifyItemInserted(position);

或删除

adapter.notifyItemRemoved(positionOfObject);
adapter.notifyItemRangeChanged(positionOfObject, arrayList.size());

效率更高

关于Android RecyclerView 创建并绑定(bind)数据集更改的所有 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37254251/

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