La mejor forma de actualizar los datos con un adaptador RecyclerView

Cuando tengo que usar un adaptador clásico con un ListView , actualizo mis datos en el ListView de esta manera:

myAdapter.swapArray(data); public swapArray(List 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 puede hacer un clear y addAll como en ListView .

Así que intenté solo con notifyDataSetChanged , pero no funcionó. Entonces probé con un adaptador de intercambio en mi opinión:

 List 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, aún tengo que crear una nueva instancia de mi adaptador y siento que no es la mejor solución. Debería poder simplemente cambiar mis datos sin un nuevo MyRecyclerAdapter .

El Adaptador RecyclerView no viene con muchos métodos disponibles en el adaptador de ListView. Pero su swap puede implementarse simplemente como:

 class MyRecyclerAdapter extends RecyclerView.Adapter { List data; ... public void swap(ArrayList datas) { if(datas == null || datas.size()==0) return; if (data != null && data.size()>0) 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 eliminar referencias y hacer referencia a la lista. El objeto de la lista anterior que ya no se puede alcanzar será basura recolectada, pero no sin antes acumular la memoria del montón. Esto sería lo mismo que inicializar un nuevo adaptador cada vez que quiera intercambiar datos.

La respuesta de @ inmyth es correcta, simplemente modifique el código un poco, 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 buscar la lista, en el uso de Retrofit onResponse (),

 adapter.swap(feedList); 

DiffUtil puede ser la mejor opción para actualizar los datos en el RecyclerView Adapter que puedes 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 configuramos una nueva lista para RecyclerView Adapter. Y llamamos notifyDataSetChanged para actualizar el adaptador. NotifyDataSetChanged es costoso. La clase DiffUtil resuelve ese problema ahora. ¡Hace su trabajo a la perfección!

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 borrar

 mData.clear() 

no es nessescary