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
- Los elementos de RecyclerView cambian de tamaño después de la actualización
- Cómo hacer un indicador de página para reciclaje horizontal
- RecyclerView se bloquea al actualizar en la parte superior
- ¿Cómo desplazar el RecyclerView de forma programática por unos píxeles específicos?
- RecyclerView no se desplaza hacia abajo
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.
- RecyclerView expandible cardView
- La vista de Recycler no se desplaza correctamente después de implementar el desplazamiento para actualizar el diseño.
- Cómo ampliar el espacio entre RecyclerView Item mientras se desplaza
- Adjuntar TextView a RecyclerView
- RecyclerView causa problemas al reciclar
- ¿Cómo ajustar correctamente el valor de elevación a recyclerview?
- Cómo obtener clics en RecyclerView (NO los niños)
- Android FlowLayout como RecyclerView LayoutManager
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.