2011-01-17 45 views
6

Quiero iterar una lista de elementos en un ListView. Este código a continuación no es suficiente para repetir todos los elementos en la lista debido al comportamiento extraño de la función getChildCount() que solo devuelve el recuento de elementos visibles.Iterar elementos ListView en Android

for (int i = 0; i < list.getChildCount(); i++) { 
    item = (View)list.getChildAt(i); 
    product = (Product)item.getTag(); 
    // make some visual changes if product.id == someProductId 
} 

Mis 7 pantalla muestra los resultados y cuando hay más de 7 elementos en la lista, no es posible acceder a la octava artículo o artículos de manera .. .. Sólo visibles

debo usar ListIterator ¿en lugar?

Gracias.

+0

Cómo está rellenando los datos, Si está utilizando un adaptador, sobre el método getCount() del adaptador de lista – Reno

Respuesta

1

Es necesario personalizar el método de su adaptador lista getView(), y poner su cheque en su interior para comprobar si Coincidencias de identificación del elemento actual:

Product product = items.get(position); 
if(product.id == someProductId) { 
    //make visual changes 
} else { 
    //reset visual changes to default to account for recycled views 
} 

Dado que por lo general sólo los elementos visibles sólo existen en un momento específico, getView se invoca cada vez que se necesita ver más. Se crean en ese momento, por lo general reciclando las vistas de los elementos ahora invisibles en la lista (de ahí que desee restablecer los cambios si los criterios NO coinciden).

+0

Hola kcoppock. Gracias por su respuesta. Ahora funciona como esperaba, excepto que no actualiza la parte visible de la interfaz de usuario hasta que me desplazo. ¿Hay algún evento que pueda activar para actualizar la UI? – pocoa

+1

Sí, puede llamar a 'listView.notifyDatasetChanged();'. Eso actualizará el ListAdapter, sin embargo, debería ser correcto incluso antes de desplazarse; Se llama a getView a medida que se crea cada vista. ¿Puedes publicar tu código de ListAdapter en la pregunta original? – kcoppock

+0

Gracias por su ayuda. Lamento mucho aceptarlo tan tarde. Creí que ya había aceptado. Aclamaciones. – pocoa

0

El número de vistas en el ListView (7) es diferente del número de elementos en el adaptador (que es más de 7). Intente utilizar un BaseAdapter.

1

Así que @kcoppock resolvió su primer problema, parece que tiene otro problema. ¿Cómo actualizar el elemento de vista? La aplicación SMS androide muestra de una manera:

  1. crear su propio elemento de la lista vista como esta:

    public class MyListItem extends RelativeLayout { 
    ... 
    } 
    

    en su lista de archivos diseño de vista material:

    < MyListItem android:layout_width=.....> 
    ... 
    </ MyListItem > 
    
  2. y en su código, cuando se puede ver su elemento de vista, registre MyListItem como un detector de datos modificado (los datos dependen de usted). Quiero decir, cuando tus datos hayan cambiado, puedes actualizar el artículo directamente.

Consulte el código fuente de la aplicación de SMS para obtener más información.