make - recyclerview android studio ejemplo
La mejor manera de actualizar datos con un adaptador RecyclerView (4)
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo actualizar los datos del adaptador RecyclerView? 12 respuestas
Cuando tengo que usar un adaptador clásico con ListView , actualizo mis datos en ListView así:
myAdapter.swapArray(data);
public swapArray(List<Data> data) {
clear();
addAll(data);
notifyDataSetChanged();
}
Me gustaría saber cuál es la mejor práctica para un
RecyclerView
.
Porque en un adaptador
RecyclerView
no se puede
clear
y
addAll
como en
ListView
.
Así que lo intenté solo con
notifyDataSetChanged
, pero no funcionó.
Luego probé con un swapAdapter en mi opinión:
List<Data> data = newData;
MyRecyclerAdapter adapter = new MyRecyclerAdapter(data);
// swapAdapter on my recyclerView (instead of a .setAdapter like with a classic listView).
recyclerViewList.swapAdapter(adapter, false);
Pero con esta última solución, todavía tengo que crear una nueva instancia de mi adaptador y siento que no es la mejor solución.
Debería poder cambiar mis datos sin un nuevo
MyRecyclerAdapter
.
El adaptador de RecyclerView no viene con muchos métodos disponibles de otra manera en el adaptador de ListView. Pero su intercambio se puede implementar simplemente como:
class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
List<Data> data;
...
public void swap(ArrayList<Data> datas)
{
data.clear();
data.addAll(datas);
notifyDataSetChanged();
}
}
También hay una diferencia entre
list.clear();
list.add(data);
y
list = newList;
El primero es reutilizar el mismo objeto de lista. El otro es desreferenciar y hacer referencia a la lista. El antiguo objeto de lista que ya no se puede alcanzar será basura recolectada, pero no sin antes acumular memoria de almacenamiento dinámico. Esto sería lo mismo que inicializar un nuevo adaptador cada vez que desee intercambiar datos.
Encontré la siguiente solución que funciona para mi problema similar:
private ExtendedHashMap mData = new ExtendedHashMap();
private String[] mKeys;
public void setNewData(ExtendedHashMap data) {
mData.putAll(data);
mKeys = data.keySet().toArray(new String[data.size()]);
notifyDataSetChanged();
}
Usando el comando clear
mData.clear()
no es nessescary
La respuesta de @inmyth es correcta, solo modifique un poco el código para manejar la lista vacía.
public class NewsAdapter extends RecyclerView.Adapter<...> {
...
private static List mFeedsList;
...
public void swap(List list){
if (mFeedsList != null) {
mFeedsList.clear();
mFeedsList.addAll(list);
}
else {
mFeedsList = list;
}
notifyDataSetChanged();
}
Estoy usando Retrofit para obtener la lista, en el uso de Retrofit onResponse (),
adapter.swap(feedList);
DiffUtil puede ser la mejor opción para actualizar los datos en el Adaptador RecyclerView que puede encontrar en el marco de Android. DiffUtil es una clase de utilidad que puede calcular la diferencia entre dos listas y generar una lista de operaciones de actualización que convierte la primera lista en la segunda.
La mayoría de las veces nuestra lista cambia por completo y establecemos una nueva lista en RecyclerView Adapter. Y llamamos a notifyDataSetChanged para actualizar el adaptador. NotifyDataSetChanged es costoso. La clase DiffUtil resuelve ese problema ahora. ¡Hace su trabajo perfectamente!