在RecyclerView中设置setHasStableIDs(true)

10

我是 Android 的新手,当我点击 RecyclerView 中的某个项目时,数据集被更改,但位置与 SQLite 中的 ID 不匹配,我很困惑。我知道我们可以使用“setHasStableId”来获取唯一的 ID,但是,我有些困惑:在哪里需要设置“setHasStableId(true)”条件?这是如何工作的?

3个回答

21

调用setHasStableIds(true)方法是为了将其应用于RecyclerView的适配器。

adapter.setHasStableIds(true);

同时,为了使其生效,您必须覆盖 getItemId(int position) 方法,以返回该位置处项目的已识别长整型。我们需要确保没有不同的项目数据具有相同的返回ID。

ID可以是来自数据库的ID,对于每个项目都是唯一的且不会更改。

//Inside the Adapter class
@Override
public long getItemId(int position) {
    return itemList.get(position).getId();
}

这将减少数据集通知时的闪烁效果,仅修改具有更改的项目。

而且好消息是它会在项目位置更改时增加酷炫的动画效果!


8
为了解决闪烁问题,我们需要重复使用相同的ViewHolder和view来呈现同一项内容,因为:
  1. RecycleView默认禁用了稳定的ID。
  2. 所以通常在notifyDataSetChanged()之后,RecyclerView.Adapter没有将相同的ViewHolder分配给原始数据集中的原始项。
因此,解决方案是:

setHasStableIds(true) :-

  • 在RecyclerView.Adapter中设置setHasStableIds(true);
  • true表示此适配器将发布唯一值作为数据集中项目的关键字。
  • Adapter可以使用该关键字指示它们是否是同一个项目,在通知数据更改后进行比较。

override getItemId(int position) :-

  • 然后,我们必须覆盖getItemId(int position),返回标识长整型以标识位置上的项

  • 我们需要确保没有不同的项目数据具有相同的返回ID。


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接