2012-07-19 14 views
8

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

+0

pls pls help me. – user1537629

+0

¿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 –

Respuesta

7

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.

  1. Cuando está utilizando "View Holder", puede acceder fácilmente a cada vista sin necesidad de buscar, lo que ahorra valiosos ciclos de procesador.
  2. 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.

1

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(...) 
    
2

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.

Cuestiones relacionadas