ViewHolder no como una clase interna

¿Puede el RecyclerView.ViewHolder ser utilizado no como una clase interna? ¿Hay algún problema al hacerlo?

He buscado alrededor, pero havent encontrado cualquier documentación sobre él!

En realidad, creo que un ViewHolder debe ser una clase anidada estática (mente la estática!) O una clase de nivel superior (que en realidad no será diferente, sólo el nombre de la clase contiene el nombre de la clase externa seguido de un $ y luego el Nombre de la clase interna).

¿Por qué pienso así? Cuando ViewHolder es una clase interna no estática del adaptador, mantiene una referencia al adaptador. Ahora, cuando llamas a RecyclerView.swapAdapter (newAdapter, false) (o era cierto? No lo recuerdo), el nuevo adaptador utilizará los ViewHolders creados previamente por el antiguo. Como es imposible anular / borrar una referencia implícita en estos titulares, esta referencia al primer adaptador se ha filtrado y no se puede recolectar basura. Esto ya es bastante malo.

Pero, en mi caso, tenía problemas reales no relacionados con la memoria. Mi adaptador tenía un 'modelo de selección' que mantuvo el mapeo de posición a datos y el titular de vista usaría los datos cuando mostró el elemento (por ejemplo, cuando el modelo de selección decía que el elemento en la posición 17 estaba seleccionado, cuando estaba Dibujado en la pantalla, su color de fuente cambiaría) para marcarlo para el usuario. Lo hizo simplemente accediendo al campo del modelo de selección desde el adaptador, que en Java significa que utiliza la referencia implícita a la instancia del adaptador adjunto y que accede a su campo. Ahora, después de swapAdapter, los ViewHolders conservados seguían usando el modelo de selección del adaptador antiguo y la interfaz de usuario estaba rota, ya que algunos elementos se mostrarían como seleccionados, mientras que en el nuevo modelo no lo eran.

Esencialmente, es imposible que estos soportes de clase interna no estáticos sobrevivan al adaptador que los creó y son utilizados por otro para realmente olvidar el antiguo y usar el nuevo adaptador, ya que no hay manera de borrar esa referencia implícita.

Existen muchas soluciones a esto, una de las cuales es que el ViewHolder sea una clase anidada estática, y simplemente déle una referencia al adaptador explícitamente cuando se vincule, y null cuando se desactiva. He estado usando clases de nivel superior para los titulares de mis vistas con referencias explícitas al adaptador, que creo que es lo que estás preguntando. Tenga en cuenta que muy a menudo los titulares no necesitan ninguna referencia a su adaptador en absoluto, así que es posible que no tenga que configurar el adaptador en absoluto.

Por supuesto, mi problema provenía del hecho de que cambié el cursor; Si no lo hace, probablemente no notará ningún problema, pero creo que lo mejor es estar al tanto de ellos.

  • Android - deshabilitar el elemento de vista de lista haga clic y vuelva a habilitarlo
  • Cambiar el diseño del elemento de lista seleccionado en Android
  • Cambio de página de devolución de llamada para PagerAdapter
  • Listview conjunto adaptador fragmento nullpointerexception
  • ¿Es Android BaseAdapter un ejemplo de patrón de adaptador?
  • BaseAdapter y ContextMenu
  • Cómo agregar el artículo a Spinner's ArrayAdapter?
  • Android PagerAdapter no llama a instantiateItem
  • Cómo eliminar listview todos los elementos
  • Adaptador de Android devolviendo LinearLayout
  • El método Android ArrayAdapter.Add no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.