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:
- ItemDecoration sobreescribir getItemOffsets () y animación
- RecyclerView Adapter da error "La jerarquía del tipo RecycleAdapter es inconsistente"
- ¿Cómo ajustar correctamente el valor de elevación a recyclerview?
- Haga doble clic en OnClickListener de un adaptador de vista de reciclador
- RecyclerView onItemClick Listener
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 !!!!
- StaggeredGridLayoutManager y elementos en movimiento
- ¿Hay alguna manera recomendada de crear un id para un ParseObject para usar en un RecyclerView?
- Android Recycler filtro adaptador de vista con animación
- ¿Por qué usar estática con RecyclerView.ViewHolder
- Cómo eliminar el elemento de RecyclerView con demora
- Desplácese hasta la parte inferior de recyclerview con varios tipos de vista
- Multiple RecyclerView en un fragmento
- Problemas con vistas dinámicas dentro de la vista del reciclador
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
- Gradle no puede compilar con java 1.8
- Agregar encabezados de autenticación a NetworkImageView en Volley