6

J'essaie d'utiliser plusieurs ViewHolders dans un RecyclerView afin d'échanger ces vues lors de l'exécution. J'ai créé deux classes qui se prolongent RecyclerView.ViewHolder:RecyclerView onCreateViewHolder Type de renvoi Incompatibilité avec plusieurs ViewHolders personnalisés

MenuItemViewHolder

public class MenuItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

public TextView menuItemText; 
public ImageView menuItemPhoto; 
public RecyclerViewAdapter rva; 

public MenuItemViewHolder(View itemView) { 
    super(itemView); 
    itemView.setOnClickListener(this); 

    rva = caller; 
    menuItemText = (TextView) itemView.findViewById(R.id.grid_text); 
    menuItemPhoto = (ImageView) itemView.findViewById(R.id.grid_image); 
} 

@Override 
public void onClick(View view) { 
    Toast.makeText(view.getContext(), "Clicked Position = " + getPosition(), Toast.LENGTH_SHORT).show(); 

} 

}

SelectedItemViewHolder

public class SelectedItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 

public TextView menuItemText; 
public ImageView menuItemPhoto; 
public RecyclerViewAdapter rva; 

public SelectedItemViewHolder(View itemView) { 
    super(itemView); 
    itemView.setOnClickListener(this); 

    menuItemText = (TextView) itemView.findViewById(R.id.grid_text_full); 
    menuItemPhoto = (ImageView) itemView.findViewById(R.id.grid_image_full); 
} 

@Override 
public void onClick(View view) { 
    Toast.makeText(view.getContext(), "Clicked Position = " + getPosition(), Toast.LENGTH_SHORT).show(); 
} 

}

Ils sont appelés au sein de ma fonction de la classe RecyclerViewAdapter onCreateViewHolder:

RecyclerViewAdapter onCreateViewHolder

// Create new views (invoked by the layout manager) 
    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case 0: 
       View gridItemLayout = LayoutInflater.from(parent.getContext()) 
         .inflate(R.layout.grid_single, parent, false); 
       // set the view's size, margins, paddings and layout parameters 
       MenuItemViewHolder vh = new MenuItemViewHolder(gridItemLayout); 
      case 2: 
       View selectedItemLayout = LayoutInflater.from(parent.getContext()) 
         .inflate(R.layout.grid_single_full, parent, false); 
       // set the view's size, margins, paddings and layout parameters 
       SelectedItemViewHolder sivh = new SelectedItemViewHolder(selectedItemLayout); 
       return sivh; 
     } 
    } 

Lorsque je tente d'exécuter le code, je reçois cette erreur:

Ainsi, la question semble être que onCreateViewHolder n'accepte pas mes classes personnalisées comme étant héritées de RecyclerView.ViewHolder. J'utilise Android Studio, alors peut-être que le problème est là. Je suis perplexe, car je pensais que l'héritage Java gérerait cela sans problème. Quelqu'un pourrait-il proposer une solution?

Éditer: Lorsque je change le type de retour de onCreateViewHolder en MenuItemViewHolder avec un seul VH, tout fonctionne bien. Cependant, cela ne fonctionne pas quand j'ai plusieurs classes VH qui peuvent être permutées à tout moment.

+0

Quelle est la définition de classe de 'RecyclerViewAdapter'? – ianhanniballake

Répondre

11

La classe RecyclerView.Adapter est une classe paramétrée qui prend en compte un type ViewHolder unique. Votre définition ressemble probablement:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MenuItemViewHolder> 

Il devrait être:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 

Ne pas oublier d'avoir la bonne définition pour onBindViewHolder ainsi. Vous devez également remplacer getItemViewType.

+1

Je suppose que tout ce que j'avais à faire était de regarder! C'est la réponse dont j'avais besoin, merci! –