如何防止RecyclerView在notifyDataSetChanged时求助

时间:2016-02-23 03:34:07

标签: android android-recyclerview

我使用StaggeredGridLayoutManager作为RecyclerView布局管理器。当我尝试加载下一页数据然后调用notifyDataSetChanged方法来更新数据时,当我滚动RecyclerView时,我注意到我将使用我的项目。

我真的不需要采取行动,我该如何防止它采取行动。而且我想知道它为什么会诉诸。

THX!

2 个答案:

答案 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);