6

Tengo un ListView que muestra en cada fila una imagen extraída de internet y una cadena.Android - ListView - llamando al getView() bajo demanda

En general, funciona bien. Sin embargo, quiero tomar el control en el camino cuando las vistas (filas) están infladas. De forma predeterminada, cuando la fila es visible, se llama al método getView() del adaptador.

Esto por supuesto no es uno de los mejores comportamientos, porque si tengo un ListView con varios cientos de registros, y necesito llegar a los que está en la parte inferior, mientras se desplaza el ListView, se invocará el método getView() para cada remar hasta llegar al pie de página.

Así que desee llamar a getView sólo después de que el desplazamiento y el ListView está en estado de pausa/inactivo, pero no tengo idea de cómo ir sobre esto:

Así es como empecé:

listView.setOnScrollListener(new OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     if(scrollState==SCROLL_STATE_IDLE){ 
      // Invoke get view only on visible items 
     } 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
      int visibleItemCount, int totalItemCount) { 

    } 
}); 

este es el getView de mi adaptador:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.row, parent, false); 

     holder = new ViewHolder(); 
     holder.title = (TextView) convertView.findViewById(R.id.textView); 
     holder.image = (ImageView) convertView.findViewById(R.id.imageView); 
     holder.position = position; 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 


    holder.title.setText(data.get(position).getTitle()); 
    holder.image.setImageResource(R.drawable.ic_launcher); 
    new LoadImageAsync(data.get(position).getUrl(), holder.image).execute(); 

    return convertView; 
} 

por favor, dame algunas instrucciones sobre dónde debería mirar con el fin de lograr esto: Call getView() sólo después de desplazarse, y sólo para visib le artículos.

+1

check ApiDemos, sección Adaptador Eficiente –

+0

@TomislavNovoselec, gracias por la pista. Eso vale la pena investigar. –

Respuesta

4

Recientemente leí un artículo sobre esto ... here. No lo he intentado, pero parece una teoría sólida.

Básicamente, recomiendan agregar un booleano que se utiliza para rastrear si se está desplazando o no y usarlo como una bandera en su adaptador. Si boolean es verdadero (está desplazándose), solo dibuje las textviews en su diseño. Si es falso (has dejado de desplazarte) dibujas todo.

Le dice al adaptador que vuelva a dibujar las vistas visibles cuando no se desplaza usando notifyDataSetChanged().

+0

Gracias por el enlace. Ese artículo junto con ejemplos de demostraciones de API me ayudaron a lograr mi objetivo. Ahora tengo el adaptador más inteligente de todos los tiempos. :) –

+0

¡Gracias, llamando a notifyDataSetChanged() después de agregar elementos adicionales en una llamada asincrónica ayudado! (usando la consulta de Android) –

Cuestiones relacionadas