RecyclerView onCreateViewHolder Tipo de devolución Incompatibilidad con varias vistas personalizadas ViewHolders

Estoy tratando de utilizar varios ViewHolders en un RecyclerView para intercambiar estas vistas en tiempo de ejecución. He creado dos clases que se extienden RecyclerView.ViewHolder:

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

}

Se llaman dentro de la función onCreateViewHolder de mi 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; } } 

Cuando intento funcionar con el código, consigo este error:

Error: Error en (48, 36): onCreateViewHolder (ViewGroup, int) en RecyclerViewAdapter no puede reemplazar onCreateViewHolder (ViewGroup, int) en Tipo de retorno del adaptador ViewHolder no es compatible con MenuItemViewHolder donde VH es una variable de tipo: VH extends ViewHolder declarado en la clase Adapter

Por lo tanto, el problema parece ser que onCreateViewHolder no acepta mis clases personalizadas como heredadas de RecyclerView.ViewHolder. Estoy usando Android Studio, así que tal vez el problema está ahí. Estoy perplejo, ya que pensé que la herencia de Java manejaría esto sin problemas. ¿Podría alguien por favor proponer una solución?

Editar: Cuando cambio el tipo de retorno de onCreateViewHolder a MenuItemViewHolder con sólo un VH, las cosas funcionan bien. Sin embargo, esto no funciona cuando tengo varias clases VH que se pueden intercambiar en cualquier momento.

El RecyclerView.Adapter es una clase parametrizada que toma un solo tipo de ViewHolder . Su definición probablemente se parece a:

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

Debería ser:

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

No se olvide de tener la definición correcta para onBindViewHolder también. Tienes que anular getItemViewType también.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.