我使用StaggeredGridLayoutManager作为RecyclerView布局管理器。当我尝试加载下一页数据然后调用notifyDataSetChanged方法来更新数据时,当我滚动RecyclerView时,我注意到我将使用我的项目。
我真的不需要采取行动,我该如何防止它采取行动。而且我想知道它为什么会诉诸。
THX!
答案 0 :(得分:2)
@ErShani对这个问题提供了宝贵的见解,我正在添加更多内容。
使用 notifyDatasetChanged()作为使用回收站视图时的最后手段。 notifyDatasetChanged()执行以下操作,我从doc
中引用此事件未指定数据集的更改内容,强制任何观察者假定所有现有项目和结构可能不再有效。 LayoutManagers将被迫完全重新绑定并重新布局所有可见视图。
如果您正在编写适配器,则尽可能使用更具体的更改事件会更有效。依靠notifyDataSetChanged()作为最后的手段。
所以在你的情况下,如果你调用notifyDatasetChanged(),已经绑定和可见的布局也会反弹,这是毫无意义和无效的。
您可以在加载其他页面后使用notifyItemRangeInserted()。这更有效,并保留了RecyclerView在数据集更改时提供的默认动画。
答案 1 :(得分:0)
RecyclerView不会对数据做任何事情。它只是通过网络服务或sqlite从您的数据库获得。
无论您提供哪种数据顺序,它都会按原样接受。因此,Recyclerview不会进行排序。
然后你也可以通过实现onChildDrawingOrder监听器来检查recyclelerview的哪个子元素首先被绘制以及之后绘制的子元素。
recyclerView.setChildDrawingOrderCallback(new RecyclerView.ChildDrawingOrderCallback() {
@Override
public int onGetChildDrawingOrder(int childCount, int position) {
// put log here
return position;
}
});
排序或求助取决于您使用recyclerview进行的布局管理器。 所以你可以试试,
layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);