Muh*_*eri 15 android android-recyclerview
我有一个非常大的应用程序,我几乎到处都使用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 次。只会针对可见项目的数量调用它。例如,如果有 4 个可见项目,则 onBindViewHolder 将被调用 4 次,当您滚动时,将根据需要绘制的项目数量调用 onBindViewHolder。
如果某些数据正在更改并且您使用notifyDatasetChanged(),那么所有视图都将被重绘。如果您正在插入一个元素并想要刷新适配器,请使用类似的内容
adapter.notifyItemInserted(position);
Run Code Online (Sandbox Code Playgroud)
或者用于删除
adapter.notifyItemRemoved(positionOfObject);
adapter.notifyItemRangeChanged(positionOfObject, arrayList.size());
Run Code Online (Sandbox Code Playgroud)
效率更高
| 归档时间: |
|
| 查看次数: |
2332 次 |
| 最近记录: |