Android Utiliser plusieurs ViewHolders avec ItemViewType


Exemple

Parfois, un RecyclerView doit utiliser plusieurs types de vues pour être affiché dans la liste affichée dans l'interface utilisateur, et chaque vue nécessite un fichier XML de mise en page différent.

Pour ce problème, vous pouvez utiliser différents ViewHolders dans un seul adaptateur, en utilisant une méthode spéciale dans RecyclerView - getItemViewType(int position) .

Voici un exemple d'utilisation de deux ViewHolders:

  1. Un ViewHolder pour afficher les entrées de la liste

  2. Un ViewHolder pour afficher plusieurs vues d'en-tête

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(context).inflate(viewType, parent, false);
        return ViewHolder.create(itemView, viewType);
    }
    
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final Item model = this.items.get(position);
        ((ViewHolder) holder).bind(model);
    }
    
    @Override
    public int getItemViewType(int position) {
        return inSearchState ? R.layout.item_header : R.layout.item_entry;
    }
    
    abstract class ViewHolder {
        abstract void bind(Item model);
    
        public static ViewHolder create(View v, int viewType) {
            return viewType == R.layout.item_header ? new HeaderViewHolder(v) :new EntryViewHolder(v);
        }
    }  
    
    static class EntryViewHolder extends ViewHolder {
        private View v;
    
        public EntryViewHolder(View v) {
            this.v = v;
        }
    
        @Override public void bind(Item model) {
            // Bind item data to entry view.
        }
    }
    
    static class HeaderViewHolder extends ViewHolder {
        private View v;
    
        public HeaderViewHolder(View v) {
            this.v = v;
        }
    
        @Override public void bind(Item model) {
            // Bind item data to header view.
        }
    }