【问题标题】:The correct way of implementing getItemId() in RecyclerView.Adapter在 RecyclerView.Adapter 中实现 getItemId() 的正确方法
【发布时间】:2017-03-07 11:19:25
【问题描述】:

我有通用类

public abstract class BaseAdapter<T> extends RecyclerView.Adapter {
  private List<T> itemsList = new ArrayList<>();
  //other override methods

  @Override
    public long getItemId(int position) {
        return position;
    }
}

实现 getItemId() 的正确方法是什么?我认为return position 在很多例子中都是不正确的。

【问题讨论】:

    标签: android adapter android-recyclerview


    【解决方案1】:
    1. 创建具有返回类型long 的方法的基本接口 例如。

      interface BaseInterface{
          long getId(); 
      }
      
    2. 改变

      abstract class BaseAdapter<T> extends RecyclerView.Adapter 
      

      abstract class BaseAdapter<T extends BaseInterface> extends RecyclerView.Adapter {
      

      注意:签名改为T extends BaseInterface

    3. 替换

      @Override
      public long getItemId(int position) {
          return position;
      }
      

      @Override
      public long getItemId(int position) {
          return itemsList.get(position).getId();
      }
      

    【讨论】:

    • itemsList 的类型为 。并且只有默认列表方法
    • 和 itemsList.get(position)。有对象方法
    • Google I/O 应用程序本身返回位置作为后备,我想知道这是否可以github.com/google/iosched/blob/…
    • hashCode() 代替getId() 怎么样?
    • hashCode() 无法强制执行。如果一个接口忘记实现它,它不会抛出错误。
    【解决方案2】:

    在列表中,您只能返回 Google 文档中提到的特定行中可用项目的 ID:

    getItemId

    获取行ID 与列表中的指定位置相关联。

    但 RecyclerView 并非如此,在 RecyclerView 中,您必须确保为每个 Item 返回一个唯一的 Id,或者在没有稳定 Id 的情况下,您应该返回 RecyclerView.NO_ID (-1)。请避免返回不稳定的值。 (一个稳定的值将是一个唯一的值,即使数据集的位置发生变化也不会改变)

    【讨论】:

    • 没错,getItemId 在 RecyclerView.Adapter 中的行为与 getItemId 在 ArrayAdapter 中的行为不同。
    【解决方案3】:

    你应该实现这个方法: 如您所见,您必须告诉适配器您通过setHasStableIds(true);实现了它

    class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    MyAdapter() {
        setHasStableIds(true); // **very importent**
    }
    
    @Override
    public long getItemId(int position) {
        // requires unique value, it means need to keep the same value
        // even if the item position has been changed.
        return mItems.get(position).getId();
    }
    

    }

    【讨论】:

    • 你能解释一下为什么这段代码给出了一个静态值吗?对我来说,mItems.get(position) 返回模型类的一个实例,它有一个返回一些整数 id 的函数。为什么你的模型会一次又一次地返回相同的 id?如果您使用的是 dbs 或网络,那么通常id 是唯一的,getId() 每次都返回一个唯一值
    • 你是对的。 “静态”是指每个项目的唯一价值。不同的值。
    • 那么请将 static 改为 unique ,因为这给出了完全不同的含义,像我这样的新手在这个答案上花费 10 分钟会更加困惑:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2010-09-21
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多