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!
- Android: cómo mostrar el gridview en blanco con el botón
- Cómo finalizar una actividad de una clase de adaptador ListView?
- Cambio de datos del adaptador ListView sin notificación de ListView
- Android: Implementación de Viewpager de dos vías sin fin
- Cómo cargar las miniaturas de Youtube en un RecyclerView utilizando la API de Youtube
- Java - Crear referencia a dos modelos en un adaptador personalizado
- ConvertView se pasa como null incluso si la vista existe
- Vista personalizada falta constructor utilizado por las herramientas para el adaptador
- ¿Quieres implementar notifyDataSetChanged o autorefresh a mi RecyclerView pero no funciona
- Establecer OnClick Listener en el botón dentro de la vista de lista en android
- Adaptador de ListView personalizado lanza UnsupportedOperationException
- Quitar y agregar la página a FragmentPagerAdapter
- Cómo llamar a notifyDataSetChanged () desde un adaptador genérico
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.
- Cuando IntentService inicia, ¿se inicia el objeto Application?
- Cambiar texto editar la fuente de notificación de error en android