way update recyclerview personalizado eventos ejemplo data crear cardview best actualizar android android-recyclerview android-adapter recycler-adapter

android - update - recyclerview adapter notifydatasetchanged



Cómo actualizar/actualizar un elemento específico en RecyclerView (12)

Actualizar elemento individual

  1. Actualizar el elemento de datos
  2. Notifique al adaptador del cambio con notifyItemChanged(updateIndex)

Ejemplo

Cambie el elemento "Ovejas" para que diga "Me gustan las ovejas".

String newValue = "I like sheep."; int updateIndex = 3; data.set(updateIndex, newValue); adapter.notifyItemChanged(updateIndex);

Mi respuesta completa con más ejemplos está here .

Estoy tratando de actualizar un elemento específico en RecyclerView .

Historia: cada vez que el usuario hace clic en el elemento, muestra AlertDialog . El usuario puede escribir texto haciendo clic en el botón Aceptar. Quiero mostrar este texto en este elemento y mostrar ImageView invisible, declarado en XML y adaptador ViewHolder ,

Utilicé esta función en AlertDialog Positive Button para actualizar el elemento:

private void updateListItem(int position) { View view = layoutManager.findViewByPosition(position); ImageView medicineSelected = (ImageView) view.findViewById(R.id.medicine_selected); medicineSelected.setVisibility(View.VISIBLE); TextView orderQuantity = (TextView) view.findViewById(R.id.order_quantity); orderQuantity.setVisibility(View.VISIBLE); orderQuantity.setText(quantity + " packet added!"); medicinesArrayAdapter.notifyItemChanged(position); }

¡Pero este código no solo cambia el itemView en la posición pasada, sino que también cambia algunos de los otros ItemView (s)!

¿Cómo debo cambiar correctamente itemView específico haciendo clic en él?


Agregue el texto modificado a su lista de datos del modelo

mdata.get(position).setSuborderStatusId("5"); mdata.get(position).setSuborderStatus("cancelled"); notifyItemChanged(position);


Creo que tengo una idea sobre cómo lidiar con esto. Actualizar es lo mismo que eliminar y reemplazar en la posición exacta. Así que primero elimino el elemento de esa posición usando el código a continuación:

public void removeItem(int position){ mData.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, mData.size()); }

y luego agregaría el elemento en esa posición particular como se muestra a continuación:

public void addItem(int position, Landscape landscape){ mData.add(position, landscape); notifyItemInserted(position); notifyItemRangeChanged(position, mData.size()); }

Estoy tratando de implementar esto ahora. ¡Te daré un comentario cuando termine!


En su adaptador RecyclerView, debe tener una ArrayList y también un método addItemsToList(items) para agregar elementos de la lista a la ArrayList. Luego, puede agregar elementos de la lista llamando a adapter.addItemsToList(items) dinámicamente. Después de agregar todos los elementos de su lista a ArrayList, puede llamar a adapter.notifyDataSetChanged() para mostrar su lista.

Puede usar notifyDataSetChanged en el adaptador para RecyclerView


En su clase de adaptador, en el método onBindViewHolder, establezca ViewHolder en setIsRecyclable (false) como en el siguiente código.

@Override public void onBindViewHolder(RecyclerViewAdapter.ViewHolder p1, int p2) { // TODO: Implement this method p1.setIsRecyclable(false); // Then your other codes }


Ese también es mi último problema. Aquí mi solución uso el modelo de datos y el adaptador para mi RecyclerView

/*Firstly, register your new data to your model*/ DataModel detail = new DataModel(id, name, sat, image); /*after that, use set to replace old value with the new one*/ int index = 4; mData.set(index, detail); /*finally, refresh your adapter*/ if(adapter!=null) adapter.notifyItemChanged(index);


La siguiente solución funcionó para mí:

En un elemento RecyclerView, el usuario hará clic en un botón, pero otra vista como TextView se actualizará sin notificar directamente al adaptador:

Encontré una buena solución para esto sin usar el método notifyDataSetChanged (), este método recarga todos los datos de recyclerView, por lo que si tiene una imagen o video dentro del elemento, se volverán a cargar y la experiencia del usuario no será buena:

Aquí hay un ejemplo de hacer clic en un icono similar a ImageView y solo actualizar una vista de texto (Posible actualizar más vista de la misma manera del mismo elemento) para mostrar como actualización de conteo después de agregar +1:

// View holder class inside adapter class public class MyViewHolder extends RecyclerView.ViewHolder{ ImageView imageViewLike; public MyViewHolder(View itemView) { super(itemView); imageViewLike = itemView.findViewById(R.id.imageViewLike); imageViewLike.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = getAdapterPosition(); // Get clicked item position TextView tv = v.getRootView().findViewById(R.id.textViewLikeCount); // Find textView of recyclerView item resultList.get(pos).setLike(resultList.get(pos).getLike() + 1); // Need to change data list to show updated data again after scrolling tv.setText(String.valueOf(resultList.get(pos).getLike())); // Set data to TextView from updated list } }); }


Puede usar el notifyItemChanged(int position) de la clase RecyclerView.Adapter. De la documentación:

Notifique a los observadores registrados que el artículo en la posición ha cambiado. Equivalente a llamar a notifyItemChanged (posición, nulo) ;.

Este es un evento de cambio de elemento, no un evento de cambio estructural. Indica que cualquier reflejo de los datos en la posición está desactualizado y debe actualizarse. El artículo en la posición conserva la misma identidad.

Como ya tiene el puesto, debería funcionar para usted.


Tengo que resolver este problema captando la posición del elemento que necesitaba ser modificado y luego en la llamada del adaptador

public void refreshBlockOverlay(int position) { notifyItemChanged(position); }

, esto llamará a onBindViewHolder (titular de ViewHolder, posición int) para este elemento específico en esta posición específica.


Una forma que me ha funcionado personalmente es utilizar los métodos de adaptador de la vista de reciclaje para hacer frente a los cambios en sus elementos.

Sería de una manera similar a esto, cree un método en la vista de su reciclador personalizado algo así:

public void modifyItem(final int position, final Model model) { mainModel.set(position, model); notifyItemChanged(position); }


si está creando un objeto y lo agrega a la lista que usa en su adaptador, cuando cambia un elemento de su lista en el adaptador, todos sus otros elementos también cambian, en otras palabras, todo se trata de referencias y su lista no mantener copias separadas de ese único objeto.


solo tiene que agregar el siguiente código en el cuadro de diálogo de alerta al guardar clic

recyclerData.add(position, updateText.getText().toString()); recyclerAdapter.notifyItemChanged(position);