android - lite - RecyclerView: ¿cómo borrar las vistas almacenadas en caché/recicladas?
como eliminar firmware huawei p9 lite (7)
Bueno, ahora lo entiendo. ¿Usas ambos diseños? Existe un método para devolver el tipo de vista para un elemento de lista / cuadrícula (id / position). También tiene que implementar este método correctamente para que el adaptador pueda reciclar el diseño correcto para la nueva vista. ¿Entiendes lo que quiero decir? :)
Utilizo un RecyclerView para mostrar una lista de elementos con un diseño de lista. Cambio de un diseño de lista a un diseño de cuadrícula, mostrando solo un subconjunto de todos los datos cuando estoy en el diseño de cuadrícula. Este conmutador utiliza un diseño XML diferente al que se presenta el diseño de lista.
Todo esto funciona bien, excepto que cuando me desplazo, las vistas de diseño de listas recicladas (¿guardadas en caché?) Llenan la cuadrícula, combinadas con los elementos de vista de diseño de cuadrícula adecuados. En otras palabras, en lugar de usar mi layout_grid.xml
para el diseño de cada elemento en el RecyclerView, obtengo elementos utilizando el diseño layout_list.xml
, pero en un formato de cuadrícula.
Esto me dice que el LayoutManager está funcionando correctamente, cambiando de una lista a un diseño de cuadrícula. Pero no todos los elementos de la vista de elementos se recrean utilizando el diseño xml de la cuadrícula, sino que se utilizan vistas de diseño de listas recicladas.
Intenté RecyclerView.removeAllViews()
, RecyclerView.removeAllViewInLayout()
, RecyclerView.swapAdapter()
(para forzar la recarga del adaptador), todo en vano.
Actualizar:
Si me desplazo dos posiciones hacia abajo en la lista y luego cambio de lista a cuadrícula, las dos primeras posiciones no pasan por onCreateViewHolder (), sino directamente a onBindViewHolder () y, por lo tanto, no están obligados a usar el diseño de la cuadrícula xml. En su lugar, los dos primeros elementos de posición se reciclan (creo) y se muestran en su formato de diseño de lista.
La clave aquí fue anular getItemViewType(int position)
y configurarlo para que pudiera verificar con qué tipo de vista (lista o cuadrícula) estoy tratando para esa posición y luego configurar el manejo de vista apropiado para esa posición en onbindViewHolder()
. A continuación, viewFormat
es simplemente un int que configuré en lista o cuadrícula cuando el usuario toca el botón de menú para cambiar el formato.
@Override
public int getItemViewType(int position) {
if (listData.size() == 0) {
return EMPTY_VIEW;
} else if (viewFormat == Constants.LIST_FORMATTED) {
return Constants.LIST_FORMATTED;
} else if (viewFormat == Constants.GRID_CONDITION) {
return Constants.GRID_CONDITION;
}
return super.getItemViewType(position);
}
Un usuario que publicó comentarios en mi publicación original me informó de esto, pero desafortunadamente esos comentarios fueron eliminados. Agradezco a ese usuario por indicarme la dirección correcta.
Parece que la respuesta aceptada es la correcta para su caso, lo que necesita hacer es devolver un tipo de vista diferente.
Si alguien necesita encontrar una manera de borrar los titulares de vista en caché y terminó en este hilo, esto es lo que encontré que funcionó.
setAdapter(null)
llamar a setLayoutManager(null)
y a setAdapter(null)
. Si desea conservar su adaptador, puede hacer algo como adapter = getAdapter(); setAdapter(null); setAdapter(adapter);
adapter = getAdapter(); setAdapter(null); setAdapter(adapter);
Recyclerview tiene almacenamiento en caché de vistas, así como un grupo de vistas recicladas (grupo de titulares de vista).
El caché es de vistas (vistas con datos poblados). Cuando LayoutManager le dice a recyclerview que la vista ya no es visible y necesaria, recyclerview comprueba si esa vista sigue siendo válida para una posición en particular, si es válida, entonces se agrega a la memoria caché, por lo que la próxima vez que LM solicite la vista para esa posición, regresa de caché como es.
Entonces, ¿qué es la piscina de vistas recicladas? Cuando las vistas se eliminan de la memoria caché o ya no son vistas válidas, los datos relacionados con esas vistas se borran y solo el objeto del titular de la vista se mantiene en conjunto. Dependiendo del itemType, el pool puede tener titulares de vista de diferentes tipos de elementos.
Ahora, en su caso, sus vistas no son válidas para esa posición en particular, ya que desea mostrar una vista completamente diferente. Por lo tanto, su adaptador debe indicar a recyclerview que todas las vistas no son válidas. La única forma de hacerlo es utilizando notifyDataSetChanged para todos los elementos. Recyclerview eliminará las vistas del caché y las agregará al grupo de vistas de Recyler. Así que ahora, cuando LM solicite una vista, se devolverá una vista reciclada (según itemType) o una vista recién creada, y el adaptador vinculará los datos a estas vistas.
Solo haz esto simple !!
adapter.notifyItemRangeRemoved(0,adapter.getItemCount());
adapter.notifyItemRangeRemoved(0,adapter.getItemCount());
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
////
data_List.add(data);
}
Utilizar
recyclerView.getRecycledViewPool().clear();
Yo tuve el mismo problema. La solución sugerida por Mann funciona bien. Otra opción sería establecer RecycledViewPool de RecyclerView en una nueva instancia. Eso también funciona para mí.
recyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());
Pero creo que anular el getItemViewType () es la solución más limpia.