在RecyclerView.Adapter中实现getItemId()的正确方法

时间:2017-03-07 11:19:25

标签: android android-recyclerview adapter recycler-adapter

我有通用类

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在许多例子中都不正确。

3 个答案:

答案 0 :(得分:13)

  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();
    }
    

答案 1 :(得分:2)

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

  

getItemId

     

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

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

答案 2 :(得分:0)

您应该实现此方法: 如您所见,您必须通过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();
}

}