Hay una pregunta simple que después de la búsqueda quise preguntarle ¿por qué creamos una clase de soporte estática y asignamos las vistas dentro de ella? Por favor aclara mis dudas, será una gran ayuda para mí.Clase de soporte en la clase de adaptador
Respuesta
Su código podría llamar al findViewById()
con frecuencia durante el desplazamiento de ListView
, lo que puede ralentizar el rendimiento. Incluso cuando el Adaptador devuelve una vista inflada para reciclar, aún necesita buscar los elementos y actualizarlos. Una forma de evitar el uso repetido de findViewById()
es utilizar el patrón de diseño "view holder"
.
Un objeto ViewHolder
almacena cada una de las vistas de componentes dentro del campo de etiquetas del Diseño, para que pueda acceder inmediatamente a ellas sin necesidad de buscarlas repetidamente. En primer lugar, debe crear una clase para mantener su conjunto exacto de vistas.
Puede leer Android Guideline para más detalles.
- Cuando está utilizando "View Holder", puede acceder fácilmente a cada vista sin necesidad de buscar, lo que ahorra valiosos ciclos de procesador.
- tener un
static inner class
por las vistas mejora considerablemente el rendimiento
también se puede ver Why does Android prefer static classes enlace.
Un enlace más interesante How ListView Work, después de leer este desarrollador de blog puede borrar la lógica de LisView y también por qué necesita implementar la clase interna estática para listView.
Es un punto de optimización. Sin un viewHolder, tendrá que llamar a los métodos findViewById cada vez. con viewHolder, solo necesita llamarlos una vez.
ejemplo con un TextView y un ImageView:
Sin ViewHolder:
if (convertView == null) { convertView = mInflater.inflate(..., null); } //Following called each time TextView tv = (TextView)convertView.findViewById(...); ImageView iv = (ImageView)convertView.findViewById(...); tv.setText(...)
Con ViewHolder:
if (convertView == null) { convertView = mInflater.inflate(..., null); holder = new ViewHolder(); //called once holder.tv = (TextView) vi.findViewById(..); holder.iv = (ImageView) vi.findViewById(...); vi.setTag(holder); } else { holder = (ViewHolder) vi.getTag(); } holder.tv.setText(...)
La respuesta también es simple, si usted Entender cómo un AdapterView
funciona.
Una AdapterView
es una vista cuyos hijos están determinados por un Adapter
. El AdapterView
(más específicamente la implementación concreta como ListView
) contiene más información de la que se muestra en un momento dado. Para optimizar el consumo de memoria y también para el rendimiento, el Adapter
generalmente reutiliza el View
s que representa los elementos individuales. Por lo tanto, tiene menos objetos View
que los datos correspondientes.
Los objetos reutilizados pueden ser una jerarquía compleja de View
so ViewGroups
. Entonces, en caso de que quiera encontrar los objetos individuales View
dentro de esta jerarquía, necesitará depender del método findViewById()
y esto se vuelve costoso cuando la jerarquía de vista tiene múltiples niveles. Por lo tanto, para simplificar (y también para mejorar el rendimiento), se usa el patrón del Visor-Titular, donde los objetos individuales View
que nos interesan se asignan a una clase interna estática.
Puede consultar el documento Android ListView and ListActivity - Tutorial de Lars Vogel para obtener más información sobre el patrón del visor.
- 1. Android: ProgressDialog no aparece en la clase de adaptador
- 2. Patrón de adaptador: adaptador de clase frente a adaptador de objeto
- 3. Diferencia entre patrón de adaptador de objeto y patrón de adaptador de clase
- 4. ¿Qué nombre de clase debo usar para un Adaptador de patrón de adaptador?
- 5. ¿Hay soporte para transacciones en la nueva clase SQLite3 PHP?
- 6. Subclasificación de una clase privada (soporte) en AVM2
- 7. ¿Cómo proporciono soporte personalizado para mi clase?
- 8. swing: clase de soporte de escucha de eventos
- 9. Asignar clase derivada de la clase base
- 10. clase concreta de la clase abstracta
- 11. Variable de la clase Delphi por clase
- 12. plantilla de clase llamado X en la clase de plantilla
- 13. cómo acceder a una variable de clase de la clase externa de clase interna en rubí
- 14. define los métodos de clase y las variables de clase en la clase de referencia R5
- 15. evento Pass de la clase C a través de la clase B a la clase A
- 16. Extracto de la clase de la clase Case copy()
- 17. ¿Qué representa la clase de clase [B en Java?
- 18. Impresión del nombre de clase derivada en la clase base
- 19. Excepción de conversión de clase de adaptador al eliminar una vista de pie de página?
- 20. Clase interna en la interfaz vs en la clase
- 21. JAXB y diferentes versiones de la clase
- 22. Campos de clase de acceso de la clase parcial
- 23. atributo de clase de dos instancias de la misma clase
- 24. La clase individual tiene un error de redefinición de clase
- 25. Obtener el nombre de clase de la clase CONSTRUIR
- 26. clase base de la función anulada método de clase base
- 27. Extensión de clase frente a la categoría de clase
- 28. C++: Con CRTP, clase definida en la clase derivada no es accesible en la clase base
- 29. getter y setter para la clase en la clase C#
- 30. ¿La clase local, la clase interna y la clase anidada son las mismas cosas en C++?
pls pls help me. – user1537629
¿Su pregunta es sobre el calificador "estático" o sobre ViewHolder en general? ¿Has leído la documentación ?: http://developer.android.com/training/improving-layouts/smooth-scrolling.html –