Estoy intentando actualizar un elemento específico en RecyclerView
.
Historia: siempre que el usuario hace clic en un elemento, se muestra AlertDialog
. El usuario puede escribir texto haciendo clic en el botón Aceptar. Quiero mostrar este texto en este elemento y mostrar invisible ImageView
- declarado en XML y adaptador ViewHolder
-
Usé esta función en el AlertDialog
botón positivo para actualizar el artículo:
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) también!
¿Cómo debo cambiar el itemView específico correctamente haciendo clic en él?
onBindViewHolder()
Actualizar un solo elemento
notifyItemChanged(updateIndex)
Ejemplo
Cambie el elemento "Ovejas" para que diga "Me gustan las ovejas".
Mi respuesta completa con más ejemplos está aquí .
fuente
Agregue el texto modificado a la lista de datos de su modelo
fuente
Creo que tengo una idea sobre cómo lidiar con esto. Actualizar es lo mismo que eliminar y reemplazar en la posición exacta. Entonces, primero elimino el elemento de esa posición usando el siguiente código:
y luego agregaría el elemento en esa posición particular como se muestra a continuación:
Estoy tratando de implementar esto ahora. ¡Te daré un comentario cuando termine!
fuente
Pude resolver este problema detectando la posición del elemento que necesitaba ser modificado y luego en la llamada del adaptador
, esto llamará a onBindViewHolder (titular de ViewHolder, posición int) para este elemento específico en esta posición específica.
fuente
La siguiente solución funcionó para mí:
En un elemento de 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 recargarán y la experiencia del usuario no será buena:
Aquí hay un ejemplo de hacer clic en un ícono similar a ImageView y solo actualizar un único TextView (es posible actualizar más vistas de la misma manera del mismo elemento) para mostrar la actualización de conteo después de agregar +1:
fuente
Una forma que me ha funcionado personalmente es usar los métodos de adaptador de la vista de reciclaje para hacer frente a los cambios en sus elementos.
Sería similar a esto, crear un método en la vista de su reciclador personalizado algo así:
fuente
En su clase de adaptador, en el método onBindViewHolder, configure ViewHolder en setIsRecyclable (falso) como se muestra en el siguiente código.
fuente
solo tiene que agregar el siguiente código en el cuadro de diálogo de alerta al hacer clic en guardar
fuente
El problema es
RecyclerView.Adatper
que no proporciona ningún método que devuelva el índice del elemento.Mi solución es crear una instancia de mapa para (elemento, posición) s
Friend
) debe implementarsehashCode()
yequals()
porque es clave en hashmap.cuando un elemento cambia,
Es bueno definir un método auxiliar
La instancia de mapa (
Map<Friend, Integer> posMap
) no es necesariamente necesaria. Si no se usa map, recorrer la lista puede encontrar la posición de un elemento.fuente
Ese también es mi último problema. Aquí mi solución utilizo modelo de datos y adaptador para mi RecyclerView
fuente
si está creando un objeto y agregándolo 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, se trata de referencias y su lista no Mantenga copias separadas de ese único objeto.
fuente
En su adaptador RecyclerView, debe tener una ArrayList y también un método
addItemsToList(items)
para agregar elementos de lista a ArrayList. Luego, puede agregar elementos de la lista mediante una llamada deadapter.addItemsToList(items)
forma dinámica. Después de que todos los elementos de su lista se hayan agregado a ArrayList, puede llamaradapter.notifyDataSetChanged()
para mostrar su lista.Puede usar el
notifyDataSetChanged
en el adaptador para RecyclerViewfuente