繁体   English   中英

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

[英]How to prevent auto scroll in RecyclerView after notifyDataSetChanged?

我有一个包含多种项目类型的RecyclerView 它看起来像这样:

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

当新消息到达时,我按日期排序并调用notifyDataSetChanged() 它运行良好,但它会自动在新项目高度上滚动我的RecyclerView 在这种情况下,我不能使用notifyItemInserted()因为我不知道排序后的项目位置。

如何强制RecyclerView不要在notifyDataSetChanged()之后滚动而不调用notifyItemInserted()

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

I.您没有可以更改哪个特定项目。 但是你知道这种变化的范围

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());

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

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

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

您可以使用列表中的list.indexOf(yourItem)知道新项目的插入list.indexOf(yourItem) 然后你可以调用notifyItemInserted()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM