RecyclerView中的setHasStableIDs(true)

时间:2017-05-20 03:20:16

标签: android listview android-recyclerview onitemclicklistener

我是android的新手,当我点击RecyclerView中的一个项目时,数据集发生了变化,位置与SQLite中的ID不匹配。我知道我们可以使用'setHasStableID'来获取唯一ID我有点困惑,我需要在哪里设置这个'setHasStableId(true)'条件?这是如何运作的?

3 个答案:

答案 0 :(得分:6)

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

adapter.setHasStableId(true);

要使此设置生效,您还必须覆盖 getItemId(int position),以返回已确定的位置长的项目。我们需要确保没有其他具有相同返回ID的商品数据。 该ID可以是数据库中的ID,对于每个商品来说都是唯一的,并且不会在整个过程中保持不变。

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

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

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

答案 1 :(得分:6)

要解决闪烁问题,我们需要重复使用相同的ViewHolder并查看同一项目。因为

  1. 默认情况下,RecycleView禁用稳定的ID。
  2. 所以一般以后 notifyDataSetChanged(),RecyclerView.Adapter未分配 与数据集中的原始项目使用相同的ViewHolder。

所以解决方案是:-

setHasStableIds(true):-

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

覆盖getItemId(int位置):-

  • 然后我们必须覆盖 getItemId(int position) ,以返回 确定了该商品在位置上的长度

  • 我们需要确保在那里 没有具有相同返回ID的其他商品数据。

答案 2 :(得分:0)

对于新读者:

请注意,对于Paging 3.0库,稳定ID是不必要的,因此不受支持。

参考:https://developer.android.com/reference/kotlin/androidx/paging/PagingDataAdapter#getitemid