如何在notifyDataSetChanged之后阻止RecyclerView中的自动滚动?

时间:2017-07-26 11:27:47

标签: android android-recyclerview

我有一个RecyclerView有几种项目类型。它看起来像这样:

  • 2017年7月21日
  • 消息1
  • 消息2
  • 消息3
  • 2017年7月22日
  • 消息4
  • 新邮件标题
  • 消息5
  • 消息6

当新邮件到达时,我按日期对其进行排序并致电notifyDataSetChanged()。它运行良好,但它会自动在新项目高度上滚动RecyclerView。在这种情况下,我无法使用notifyItemInserted()因为我在排序后不知道项目位置。

RecyclerView如何强制notifyDataSetChanged()notifyItemInserted()没有通话[2.3, 5.2, 1.2];之后滚动?

3 个答案:

答案 0 :(得分:6)

您可以通过4种方式尝试。因为我不知道你的视图高度是多少,所以我无法确定它是否真的有用。但是试一试

我。您不知道哪个具体项目可以更改。但是你知道这种变化的范围

mAdapter.notifyItemInserted(position);                 
mAdapter.notifyItemRangeChanged(0, list.size());

II。在致电notifyDataSetChanged()

之前清除清单
yourList.clear();
mAdapter.notifyDataSetChanged();

III。在添加新项目之前/之后保存/重置ReyclerView状态

    // Save state
    private Parcelable recyclerViewState;
    recyclerViewState = recyclerView.getLayoutManager().onSaveInstanceState();

    // Restore state
    recyclerView.getLayoutManager().onRestoreInstanceState(recyclerViewState);

IV。使用此功能

mAdapter.notifyItemRangeChanged(0, list.size());

答案 1 :(得分:1)

你玩过myRecView.getLayoutManager().setStackFromEnd(boolean)吗?

如果您可以确定在对可见部分上方或下方进行排序后是否已插入新项目,并且在此调用setStackFromEnd ()的函数中使用true或false,则可以避免滚动。

我不知道它是否真的有用......

答案 2 :(得分:1)

您可以使用项目列表中的list.indexOf(yourItem)了解新项目的插入位置。然后你可以拨打notifyItemInserted()