¿RecyclerView.ViewHolder siempre tiene que ser una clase interna?
Tengo dos RecyclerView.Adapter
s que están utilizando exactamente el mismo RecyclerView.ViewHolder
s como clases internas.
Quería deshacerme de la duplicación de código y hacer que estos ViewHolder
una clase separada para que la nueva clase pueda ser utilizada por cualquier RecyclerView.Adapter
.
- Android y JNI cómo pasar una matriz de datos Byte a JNI y recuperar Byte
- Android: El tipo java.lang.Enum no se puede resolver
- ¿Error de Twitter al publicar un mensaje en android?
- Resaltar texto en varios controles EditText simultáneamente
- Añadir al archivo android
Sin embargo me enfrenté a muchos problemas por ejemplo dificultad en el acceso a los objetos del adaptador. getAdapterPosition()
siempre devuelve -1
.
Así que cambié de opinión y hice una clase Super RecyclerView.Adapter
que es extendida por esos adaptadores y poner el ViewHolder en la superclase para que los adaptadores puedan usarlo desde la subclase.
Pero quiero saber si ViewHolder
tiene que ser una clase interna. Esto me hace molesto. Por favor, no me aconsejo que combine las clases de adaptador, son completamente diferentes, ya que el ViewHolder
es sólo un tipo de vista especial que puede aparecer en cualquier RecyclerView
Estoy esperando sus mejores enfoques que me hacen sentir mejor.
Saludos.
- Android, ClassNotFoundException cuando se utiliza "proyecto proporcionado" o IllegalArgumentException: ya agregado, al usar "proyecto de compilación"
- No se puede crear el directorio en el almacenamiento externo aunque los permisos aparentemente están configurados correctamente
- Java.lang.IllegalStateException: Ya conectado
- ¿Hay alguna diferencia entre Base64.encodeBase64 de Apache y Base64.encode de Android con el indicador Base64.Default?
- Android: Haciendo código simple. SECO
- ¿Dónde ejecutar algoritmos complejos? Lado del servidor o lado del cliente?
- Android Telegram App -> java.lang.UnsatisfiedLinkError: No se ha encontrado ninguna implementación para void
- ¿Cuál es la forma correcta de configurar Android applicationId cuando se utilizan dimensiones de sabor?
En realidad, no .
Primero usted necesita entender que por qué necesitamos clase interna?
Necesitamos clases internas donde queremos que solo una clase particular tenga esta funcionalidad. Como tenemos muchas clases internas para muchos Listeners
y Button
onClick y muchos más.
Así que utilizamos la clase interna para hacer las cosas privadas, cortas y simples .
Puedes hacer que esta cosa ( ViewHolder
) sea una clase separada. Pero eso no será eficiente, claro (si haces otra clase agregará una clase extra a tu proyecto) y de manera efectiva.
ViewHolder puede estar fuera de clase . La clase interna es sólo una proposición en todos los tutoriales para RecyclerView, es mejor si su ViewHolder debe tener acceso a todos los parámetros del Adaptador, incluso los privados, pero cualquier acceso u objetos pueden ser recreados por métodos de acceso en Adapter y ViewHolder.
He creado un proyecto independiente con el uso de ViewHolder como clase exterior, eche un vistazo. Enlace al repositorio – https://github.com/maciejsikora/outsideviewholder .
Creo que también Sus problemas son coused que en la primera versión de código ViewHolder era la clase interna y tiene acceso a las propiedades, después de cambiar el código de la clase externa debe ser refactorizado y todas las relaciones entre ViewHolder y Adpater debe ser comprobada.
Respuesta para la pregunta es – ViewHolder no tiene que ser la clase interna, y Sus problemas son coused implementación de código no válido de usar ViewHolder como clase fuera.
Siempre lo he utilizado como interior. Entiendo su problema y he tratado con él por un tiempo demasiado y creo que este post tiene la respuesta para ello. El tipo de esta respuesta tenía problemas con los adaptadores también.
Compruébelo aquí: https://stackoverflow.com/a/29719632/6634292
Su pregunta es una pregunta interesante;)
- Cómo crear menú emergente como submenú de otro elemento de menú de menú emergente
- Android webView: Es posible configurar el teclado numérico primero por defecto cuando se usa input type = text