Cómo cambiar el tipo de vista de un elemento RecyclerView onClick

He creado un RecyclerView con tarjetas como su tipo de vista principal. Lo que estoy tratando de lograr es que cuando el usuario hace clic en un elemento de ViewType de ese elemento se cambia de las tarjetas a otro Viewtype (por ejemplo, una lista de vistas de texto colocadas horizontalmente desplazable).

Mi código para RecyclerView Adapter es el siguiente:

En el siguiente fragmento de código he creado un arrraylist de tipos de enum para realizar un seguimiento del estado de clic de cada fila en recyclerview, entonces tengo el tamaño de mi conjunto de datos e inicializado mi arraylist para cada fila con SHOW_PRIMARY_CONTENT

public class DisplayItemsAdapter extends RecyclerView.Adapter<DisplayItemsAdapter.ViewHolder> { private static ArrayList<clickedState> itemClickedState; private enum clickedState { SHOW_PRIMARY_CONTENT, SHOW_SECONDARY_CONTENT } private ArrayList<ItemData> mDataset = new ArrayList<>(); public DisplayItemsAdapter(ArrayList<ItemData> dataset) { mDataset = dataset; itemClickedState = new ArrayList<>(); for (int i = 0; i < mDataset.size(); i++) { itemClickedState.add(i, clickedState.SHOW_PRIMARY_CONTENT); } } 

A continuación se muestra mi clase ViewHolder que contiene referencias a todas las vistas de mi hijo, implementa View.OnClickListener. ¿Por qué implementa View.OnClickListener es para que pueda alternar entre los estados de clic para cambiar viewTypes en consecuencia.

 public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView tvItemName; TextView tvItemNumber; public ViewHolder(View itemView) { super(itemView); tvItemName = (TextView) itemView.findViewById(R.id.tvItemName); tvItemNumber = (TextView) itemView.findViewById(R.id.tvItemNumber); tvTicketClass = (TextView) itemView.findViewById(R.id.tvTicketClass); } @Override public void onClick(View v) { itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); } } 

Aquí es donde estoy consiguiendo el valor de viewType devuelto por getItemViewType y volviendo el diseño inflado

 @Override public DisplayItemsAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View v1 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.display_Items_row, viewGroup, false); View v2 = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.display_Items_ticket_class, viewGroup, false); if (viewType == 0) { return new ViewHolder(v1); } else { return new ViewHolder(v2); } } 

Entonces aquí estoy vinculando las vistas con los valores de acuerdo a la viewType devuelto por el viewholderusing viewholder.getItemViewType

 @Override public void onBindViewHolder(DisplayItemsAdapter.ViewHolder viewHolder, final int position) { if (viewHolder.getItemViewType() == 0) { viewHolder.tvItemName.setText(mDataset.get(position).strItemName); viewHolder.tvItemNumber.setText(mDataset.get(position).strItemNumber); } else if (viewHolder.getItemViewType() == 1) { for (int i = 0; i < mDataset.get(position).strClass.length; i++) { viewHolder.tvTicketClass.setText(mDataset.get(position).strClass[i]); } } } @Override public int getItemCount() { return mDataset.size(); } 

Y finalmente mi lógica getItemViewType

 @Override public int getItemViewType(int position) { if (itemClickedState.get(position) == clickedState.SHOW_SECONDARY_CONTENT) return 1; return 0; } } 

Lo que no podía entender es que por qué no se muestra nada cuando ejecuto el código ,,, Todo parece válido para mí. Ayuadame !!!!

Ver mi ejemplo:

  // RecycleItemObject.java public class RecycleItemObject { public static int LAYOUT_ITEM_PORTRAIN = 0; public static int LAYOUT_ITEM_LANDSCAPE = 1; private int type; .................... /** * @return get layout type of item */ public int getType() { return type; } /** * set layout type of item * @param type */ public void setType(int type) { this.type = type; } } // adapter public Holder onCreateViewHolder(ViewGroup parent, int viewType) { View view; if (viewType == RecycleItemObject.LAYOUT_ITEM_PORTRAIN) { view = LayoutInflater.from(context).inflate(R.layout.item_recycle_view_main, parent, false); } else { view = LayoutInflater.from(context).inflate(R.layout.item_recycle_view_main_land, parent, false); } } // event click item @onClick.... curentObject.setType(RecycleItemObject.LAYOUT_ITEM_LANDSCAPE); // notify item only notifyItemChanged(itemPosition); 

Conmigo funciona bien

Espero que haya descubierto su problema. Si no, entonces lo he hecho para ti. La línea de buggy es

  @Override public void onClick(View v) { itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); } 

Aquí lo que estás haciendo es agregar un nuevo elemento a

  itemClickedState.add(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); 

Esto insertará un nuevo elemento y tamaño de mdataList y itemClickState difiere y por lo tanto mis coincidencia sucede.

Utilizar itemClickedState.set(getAdapterPosition(), clickedState.SHOW_SECONDARY_CONTENT); en lugar. Y la segunda cosa que no entiendo es tvTicketClass . Si es un único TextView, entonces debe concatenar primero la cadena y hacer tvTicketClass.settext(concatenatedstrClass) . Espero que te ayuden de este post.If tener cualquier otro problema, por favor, hacer comentarios.

Reemplace getItemViewType en el adaptador y devuelva itemtype que desee. Para obtener más información sobre este enlace https://guides.codepath.com/android/Heterogenous-Layouts-inside-RecyclerView

  • NotifyDataSetChanged () no se actualiza el adaptador
  • Bloc de vista de reciclador y problema de repetición
  • Error al inflar la clase RecyclerView
  • Obtener el elemento seleccionado y su posición en RecyclerView
  • Android RecyclerView con volteo de CardView
  • Recyclerview lag en desplazamiento debido a los anuncios de Admob
  • ¿Hay observadores escritos en RecyclerView.Adapter para saber si el conjunto de datos ha sido cambiado?
  • Elemento de Recyclerview efecto de ondulación de clic
  • RecyclerView se desplaza hacia arriba en notifyDataSetChanged en la pantalla de chat
  • RecyclerView enfrenta pequeños problemas
  • RealmSearchAdapter no recicla la vista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.