Android RecyclerView创建并绑定数据集更改的所有视图

Android RecyclerView创建并绑定数据集更改的所有视图,第1张

概述我有一个非常大的应用程序,我几乎到处都使用RecylclerViews,我知道如何实现RecyclerViews,我没有遇到任何问题!但是最近我在其中一个房车上遇到了一个非常糟糕的延迟,(让我向你保证我的bindview方法非常好,我加载了asynctasks中的所有图像……),这是第一次显示RV我得到一个ANR!经过

我有一个非常大的应用程序,我几乎到处都使用RecylclerVIEws,
我知道如何实现RecyclerVIEws,我没有遇到任何问题!
但是最近我在其中一个房车上遇到了一个非常糟糕的延迟,(让我向你保证我的bindvIEw方法非常好,我加载了asynctasks中的所有图像……),这是第一次显示RV我得到一个ANR!

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

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

编辑

显然原因是由于我的XML以及我如何使RV填充空闲区域,因为当我将其高度设置为指定值(例如400 dp)时,一切正常,但是如果我使用linearLayout和layout_weight或者做与relativeLayout相同(设置在对齐顶部元素下方和对齐底部元素上方)重新创建问题.

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

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

对于未来的Googlers

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

解决方法:

onBindVIEwHolder是将被调用以显示视图的那个.第一次设置适配器onBindVIEwHolder()将不会被调用200次.只会调用可见的项目数. Fox示例,如果有4个项目可见,onBindVIEwHolder将被调用4次,因为滚动onBindVIEwHolder将被调用,具体取决于需要绘制的项目数量.

如果某些数据正在更改并且您使用notifyDatasetChanged(),那么将重绘所有视图.如果要插入元素并想要刷新适配器,请使用类似的东西

adapter.notifyItemInserted(position);

或者删除

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

效率更高

总结

以上是内存溢出为你收集整理的Android RecyclerView创建并绑定数据集更改的所有视图全部内容,希望文章能够帮你解决Android RecyclerView创建并绑定数据集更改的所有视图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1096783.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存