android - studio - recyclerview seleccionar item
Emitir refrescante una vista de una fila en recyclerview (3)
Puede usar esto para obtener la vista del elemento actualizado:
View v = recyclerView.getLayoutManager().findViewByPosition(position);
if (v != null){
//update your view
}
Quiero actualizar una vista de la vista de reciclador cuando se ha llamado a notifyItemChanged. La cuestión es que no quiero actualizar toda la fila, sino solo la vista de la fila. (para evitar el efecto de parpadeo de la fila)
Hay un método llamado notifyItemChanged (int, payload obj).
¿Puedo usar eso para lograr eso? Si es así, ¿cómo hacerlo?
Supongamos que tiene una lista de elementos Array , y se alimenta al adaptador RecyclerView. Deja que sea algo como esto.
List<String> items = new ArrayList<>();
RecyclerAdapter adapter = new RecyclerAdapter(items);
recyclerView.setAdapter(adapter);
Ahora, como puedo ver, desea insertar elementos en RecyclerView y llamar al método notifyItemChanged (int position) para agregar solo el elemento individual.
Para esto, digamos que ha cambiado el valor del artículo en la posición 0. Ese es el primer elemento de la lista.
Ahora el uso correcto del método notifyItemChanged (int position) será
adapter.notifyItemChanged(0);
Esto significa que el adaptador actualizará la vista del reciclador con el nuevo valor en la posición 0.
Finalmente encontré cómo actualizar solo la vista específica de una fila en RecyclerView.
(1) Reemplazar onBindViewHolder (Recycler.ViewHolder VH, int position, List payloads) en el adaptador
(2) Dentro de ese método onBindViewHolder,
if(payloads != null && !payloads.isEmpty() && (payloads.get(0) instanceof customObject)){
// update the specific view
}else{
// I have already overridden the other onBindViewHolder(ViewHolder, int)
// The method with 3 arguments is being called before the method with 2 args.
// so calling super will call that method with 2 arguments.
super.onBindViewHolder(holder,position,payloads);
}
(3) Entonces, para notificar el cambio de datos y actualizar la vista, debe llamar a notifyItemChanged (int position, Object payload) . Necesita pasar el objeto personalizado (modelo que contiene los datos) como el objeto de carga útil.
adapter.notifyItemChanged(i, obj);
Nota: es necesario desactivar el ItemAnimator de RecyclerView (por defecto está habilitado). De lo contrario, el objeto de la carga útil estará vacío.
recyclerView.setItemAnimator(null);
o
((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
ACTUALIZACIÓN: utilicé este método recientemente sin deshabilitar el ItemAnimator. Entonces no es necesario deshabilitar ItemAnimator. - (recyclerview-v7: 25.4.0)