web-dev-qa-db-fra.com

La manière correcte d'implémenter getItemId () dans RecyclerView.Adapter

J'ai cours générique 

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

Quelle est la bonne façon de mettre en œuvre getItemId ()? Je pense que return position comme dans beaucoup d’exemples n’est pas correct.

6
Sky
  1. Créez une interface de base avec une méthode qui retourne un type long Eg.

    interface BaseInterface{
        long getId(); 
    }
    
  2. Changement 

    abstract class BaseAdapter<T> extends RecyclerView.Adapter 
    

    à 

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

    Remarque: La signature a été modifiée en T extends BaseInterface

  3. Remplacer 

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

    avec

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

Dans la liste, vous pouvez uniquement renvoyer l'ID de l'élément disponible sur une ligne spécifique, comme indiqué par Google documents:

getItemId

Obtenez l'identifiant de ligne Associé à la position spécifiée dans la liste.

Mais ce n'est pas le cas avec RecyclerView. Dans RecyclerView, vous devez vous assurer de renvoyer un identifiant unique pour chaque élément ou, en l'absence d'identifiant stable, de renvoyer RecyclerView.NO_ID (-1). Veuillez vous abstenir de renvoyer des valeurs qui ne sont pas stables. (Une valeur stable serait une valeur unique qui ne change pas même si la position de l'ensemble de données change)

2
Keivan Esbati