在 RecyclerView 的第一个索引处添加项目并调用 notifydatasetchange 后如何保持在滚动位置

Posted

技术标签:

【中文标题】在 RecyclerView 的第一个索引处添加项目并调用 notifydatasetchange 后如何保持在滚动位置【英文标题】:How to remain at a scroll position in RecyclerView after adding items at its first index and call notifydatasetchange 【发布时间】:2016-01-05 21:00:02 【问题描述】:

我正在使用 RecyclerView,我在第一个项目之前添加项目,滚动位置向上移动到新添加的第一个项目。在第一个索引处添加新项目并调用 notifydatasetchange() 后,如何保持滚动位置?

这就是我在适配器中所做的事情

    mCurrentFragment.items.addAll(0, createLineItems(dataArrayList));

    notifyDataSetChanged();

有什么建议吗?

【问题讨论】:

您可以根据您插入的项目数量计算它并手动设置滚动值 好的,我会试试的,谢谢 【参考方案1】:

有两种选择:

    使用更复杂的notify

    List newData = createLineItems(dataArrayList);
    mCurrentFragment.items.addAll(0, newData);
    notifyItemRangeInserted(0, newData.size());
    

    使用稳定的 ID。在您的适配器上覆盖 public long getItemId (int position) 以使其返回 MEANINGFUL 值并在其上调用 setHasStableIds(true);

【讨论】:

@Budius 你说的有意义是什么意思?这是否意味着与每个项目相关的唯一 ID? @HamzehSoboh 我就是这个意思。如果您的 ID 只是位置(例如),它将不起作用。它必须是(例如)用户 ID 或照片 ID,因此当视图位置发生变化时,ID 仍然与数据绑定 它在 notifyItemRangeInserted 上有效,但在 setHasStableIds 上无效,尽管 getItemId 为该项目的日期返回 getTime(),这是独一无二的。

以上是关于在 RecyclerView 的第一个索引处添加项目并调用 notifydatasetchange 后如何保持在滚动位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在顶部的第一个项目装饰后剪辑 recyclerView

RecyclerView 显示两个突出显示的项目

如何在 Hive DB 框中的位置 0 处插入项目?

从其他片段添加新的 RecyclerView 项

Firebase RecyclerView 项目之间的填充

Android RecyclerView 添加和删除项