Правильный способ реализации getItemId() в RecyclerView.Адаптер

у меня есть универсальный класс

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 как и во многих примерах, неверно.

2 ответов


  1. создайте базовый интерфейс, который имеет метод, возвращающий тип long например.

    interface BaseInterface{
        long getId(); 
    }
    
  2. изменить

    abstract class BaseAdapter<T> extends RecyclerView.Adapter 
    

    to

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

в списке вы можете вернуть только идентификатор элемента, доступного в определенной строке, как указано в документах Google:

getItemId

получить идентификатор строки связано с указанной позицией в списке.

но это не так с RecyclerView, в RecyclerView вы должны убедиться, что вы либо возвращаете уникальный идентификатор для каждого элемента, либо в случае отсутствия стабильного идентификатора вы должны вернуть RecyclerView.NO_ID (-1). Пожалуйста, воздержитесь от возвращения значения, которые не являются стабильными. (Стабильное значение будет уникальным значением, которое не изменяется, даже если изменяется позиция набора данных)