6

Sto tentando di utilizzare più ViewHolders in un RecyclerView per scambiare queste visualizzazioni in fase di esecuzione. Ho creato due classi che si estendono RecyclerView.ViewHolder:RecyclerView onCreateViewHolder Incompatibilità del tipo di reso con più ViewHolders personalizzati

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

}

Essi sono chiamati all'interno della funzione onCreateViewHolder della mia classe RecyclerViewAdapter:

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

Quando provo a eseguire il codice, ottengo questo errore:

Quindi, la questione sembra che onCreateViewHolder non accetti le mie classi personalizzate come ereditate da RecyclerView.ViewHolder. Sto utilizzando Android Studio, quindi forse il problema è lì. Sono perplesso, dal momento che pensavo che l'ereditarietà di Java potesse gestirlo senza problemi. Qualcuno potrebbe proporre una soluzione?

Modifica: quando cambio il tipo di ritorno di onCreateViewHolder in MenuItemViewHolder con un solo VH, le cose funzionano correttamente. Tuttavia, questo non funziona quando ho più classi VH che possono essere scambiate in qualsiasi momento.

+0

Qual è la definizione di classe di 'RecyclerViewAdapter'? – ianhanniballake

risposta

11

RecyclerView.Adapter è una classe parametrizzata che accetta un solo tipo ViewHolder. La tua definizione probabilmente assomiglia:

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

Dovrebbe essere:

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

Non dimenticare di avere la definizione giusta per onBindViewHolder pure. È necessario sostituire anche lo getItemViewType.

+1

Immagino che tutto quello che dovevo fare era alzare lo sguardo! Questa è la risposta di cui avevo bisogno, grazie! –

Problemi correlati