RecyclerView中的setHasStableIDs(true)

phe*_*eww 3 android listview onitemclicklistener android-recyclerview

我是android新手,在RecyclerView中单击一个项目时卡住了,该项目的数据集已更改并且位置与SQLite中的ID不匹配。我知道我们可以使用'setHasStableID'获得唯一ID,但我很少关于在哪里需要设置此“ setHasStableId(true)”条件感到困惑?这是如何运作的?

小智 8

setHasStableIds(true)将应用于RecylerView的适配器。

adapter.setHasStableIds(true);
Run Code Online (Sandbox Code Playgroud)

同样,要使此方法生效,您必须必须重写getItemId(int position),以返回针对该位置上的项目的已识别的long。我们需要确保没有其他具有相同返回ID的商品数据。该ID可以是数据库中的ID,该ID对每个项目都是唯一的,并且不会在整个过程中保持不变。

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

这将减少对数据集通知的闪烁影响,该通知仅修改有更改的项目。

最重要的是,它将在项目位置更改时添加酷炫的动画!


Alo*_*hra 7

为了解决闪烁问题,我们需要为同一个项目重用相同的 ViewHolder 和视图。因为

  1. 默认情况下,RecycleView 禁用稳定 ID。
  2. 所以一般在notifyDataSetChanged()之后,RecyclerView.Adapter并没有将相同的ViewHolder分配给数据集中的原始项。

所以解决方案是:-

setHasStableIds(true) :-

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

覆盖 getItemId(int position) :-

  • 然后我们必须覆盖getItemId(int position),以返回位置处项目的识别长度

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