我有一个非常大的应用程序,几乎在所有地方都使用了RecyclerViews。我知道如何实现RecyclerViews,并且从来没有遇到过任何问题!但是最近,在一个RV上出现了非常糟糕的延迟(让我向您保证,我的bindview方法完全正确,我在异步任务中加载所有图像等...),并且在第一次显示RV时,我会收到ANR错误!
经过数小时的调试,我发现每次数据集更改(notifyDataset()),包括RV首次填充时,所有视图都会同时被创建和绑定(是的,约200次onCreateView()被调用,这与RecyclerView的理念完全相反!)
一旦所有视图都被创建和绑定,应用程序开始正常运行,我的意思是没有更多的onCreateView()和as required onBindView()调用,也没有任何延迟。
我知道很难找到原因,但我想也许有明显的设置或...会导致这种情况,或者SO用户的某些过去经验可以帮助我。
编辑
显然,原因是由于我的XML及如何使RV填充空白区域造成的,因为当我将其高度设置为指定值(例如400 dp)时,一切都可以正常工作,但是如果我使用LinearLayout和layout_weight
或者使用RelativeLayout(设置为以下方对齐元素,并以上方对齐底部的元素)会重新创建此问题。
所以我可以说,当需要动态计算RV的高度时,就会出现此问题,并且我猜测它会创建所有子项来计算其高度,显然这是支持库中的一个错误(在当时的com.android.support:recyclerview-v7:23.4.0中)。
有人有解决方法吗?或者可以告诉我我的错误?
解决方案
对于未来的谷歌搜索者
似乎解决方案是在LayoutManager上使用setAutoMeasureEnabled(false);
。
23.2.0
版本中引入,旨在帮助使用wrap_content作为RV项目的布局参数,我通过这种方法克服了问题,并且使用wrap_content作为我的项目高度而没有任何问题。
setAutoMeasureEnabled(false)
是无效的(现在已经被弃用了)。唯一有用的方法是给 RecyclerView 设置一个固定的大小。请注意,不要改变原文意思。 - Till Krempel