Estoy tratando de entender la ListView concepto y cómo funciona, y estoy tratando de crear mi propio adaptador que se extiende BaseAdapter. Para ArrayAdapter por ejemplo, existe la notifyDataSetChanged() método que debe ser llamado después de que hayas actualizado la lista de matriz que contiene todos sus datos, en orden a actualizar la ListView.

Pero yo estoy creando mi propia subclase de BaseAdapter. Ese método no está disponible para mí, ¿o no? ¿Cómo puedo aplicar este método? Básicamente, lo que hace que el método de hacer exactamente, tal vez voy a comprender.

En el caso de la ArrayAdapter supongo que se ve en qué posición de la ListView está mostrando actualmente y se comprueba si es el mismo que en el ArrayList después de que se ha actualizado? O…

Se dice que el método:

Notifica a las que se adjunta a los observadores de que los datos subyacentes ha sido
cambiado y cualquier punto de Vista que refleja el conjunto de datos debe actualizarse.

Pero, ¿cómo exactamente se actualice?

Puede alguien explicar por favor?

InformationsquelleAutor AndreiBogdan | 2012-09-01

4 Comentarios

  1. 183

    He descubierto. Yo no podía entender cómo es el infierno el adaptador comenzó y cómo lo hizo saber donde conseguir los datos. Cuando me extendió la BaseAdapter clase, en el constructor de la clase I se inicializa la lista de artículos que me quería ver en el ListView. Pero yo no podía entender cómo estos valores son los que se utilizan y cuándo.

    Así que aquí está la cosa !!! :

    En el BaseAdapter hay algunos métodos que necesita ser reemplazado. Entre estos, hay getCount().

    Cuando el ListView se crea y todo lo demás, llama getCount(). Si devuelve un valor diferente de 0 (me devuelve el tamaño de la ArrayList que previamente había inicializa en el constructor), a continuación, llama a getView() las veces suficientes como para llenar la pantalla con los elementos. Por ejemplo, me inicializa el ArrayList con 20 elementos. Porque sólo 8 inicialmente los elementos en la pantalla, getView() fue llamado 8 veces, cada vez preguntando para la posición se requiere para mí retorno (más precisamente quería saber cómo la fila se vería en la lista de en que posición específica, ¿qué datos se necesitan para contener). Si me desplácese hacia abajo en la lista, getView() se llama una y otra vez, hasta que llegué al final de la lista, en mi caso 20 elementos por filas.

    Lo notifyDataSetChanged() hace es … cuando se le llama, se ve en qué elementos se visualizan en la pantalla en el momento de su llamamiento (más precisamente, que la fila de los índices ) y las llamadas getView() con esas posiciones.

    es decir, si usted está mostrando los primeros 8 elementos en la lista (para aquellos que son visibles en la pantalla) y agregar otro elemento entre la 2ª y 3ª posición en la lista y llamar notifyDataSetChanged() luego getView() es llamado en 8 ocasiones, con posiciones de partida desde 0 y terminando con 7, y porque en el getView() método que usted está recibiendo los datos de la ArrayList, a continuación, volverá automáticamente el nuevo elemento insertado en la lista junto a 7 de los últimos 8 (7 y no 8 debido a que el último elemento fue una posición hacia abajo, por lo que no se ve), y el ListView va a redibujar, o lo que sea, con estos elementos.

    También, es importante especificar es que si has implementado getView() correctamente, usted va a terminar el reciclaje de los elementos (objetos) ya aparece (en lugar de crear otros nuevos). Ver este video alrededor de las 12:00 minutos para ver la forma correcta de implementar getView()

    He calculado todo esto mediante la colocación de las llamadas a LogCat en cada método y a raíz de lo que estaba pasando.

    Espero que esto ayude a alguien que recién ahora está empezando a entender cómo ListViews de trabajo.

    P. S. Este ejemplo también me ayudó mucho a entender.

    ACTUALIZACIÓN

    Hoy en día ListViews en realidad no son utilizados más. Android salió con la RecyclerView que hace el reciclaje de los puntos de vista de usted, pero el conocimiento de los conceptos básicos de un ListView ayuda con la comprensión de la RecyclerView.

    Aquí un enlace de referencia: https://developer.android.com/guide/topics/ui/layout/recyclerview

    • Bueno, es una buena explicación. Pero pensamos que sabe cómo ListView obras.
    • gran explicación:), ojalá pudiera dar más de 1 voto.
    • Me alegro ayudó.
    • Esta es una de las mejores explicaciones que he encontrado! super cosas!
    • ‘me alegro ayudó.
    • No puedo encontrar this video más. Por favor podría ofrecer el hipervínculo actualizado?
    • seguro, simplemente lo hizo. ‘logró encontrar el vídeo en Youtube. La mejor de las suertes para usted. 🙂
    • Porque sólo 8 inicialmente los elementos en la pantalla, getView() fue llamado 8 veces. Que no es siempre cierto, ya que el adaptador puede llamar a algunos adicionales getViews para la medición.
    • He seguido ur respuesta..puede usted ayudar?
    • con qué exactamente ?
    • ver exactamente mi problema stackoverflow.com/questions/28148618/…
    • hizo usted?
    • muy buena explicación.
    • Cómo conecto el adaptador para el control ListView? Yo tenía una pregunta similar, que se me ha pegado en para las últimas 3 horas! stackoverflow.com/questions/35098789/listview-arraylist/…

  2. 13

    BaseAdapter puede ser «observado» por otras clases. Cuando usted está llamando el método de ListView setAdapter() se llama registerDataSetObserver de adaptador. Así, adaptador sabe que están interesados en los nuevos datos.

    Puede comprobar el origen de BaseAdapter aquí. Es muy pequeño.

    notifyDataSetChanged es disponible para usted y usted está básicamente no debería anular (porque no está haciendo nada especial, tan solo puede utilizarlo en su propia clase).

    • Creo que este es el más «spot-on» respuesta a la pregunta.
    • ¿Cómo puedo vincular mi adaptador para mi arraylist?
    • Esto debe ser aceptado respuesta!
  3. 9

    Suponga que su ListView muestra algunos de los datos almacenados en un ArrayList.

    Después de cambiar el contenido de la ArrayList, usted necesita decirle a la lista que el origen de los datos, había cambiado y se necesita redibujar sí mismo para mostrar los nuevos datos.

    Así, que es donde notifyDatasetChanged() viene en. Se dice que el ListView que los datos han sido modificados; y para mostrar los nuevos datos, el ListView debe ser redibujada.

    • Bueno, eso es lo que yo estoy haciendo. Donde puedo saber el adaptador de que estoy usando un cierto ArrayList para almacenar los datos? Cuando yo uso el ArrayAdapter sí, yo enviaré la referencia a un objeto ArrayList cuando me conecte el adaptador a la ListView, pero ¿y cuando extiendo la BaseAdapter? ¿Cómo saber para tomar los valores de mi ArrayList?
    • Así, cuando notifyDatasetChanged() se llama me fuerza el ListView para llamar la getView() método de los elementos mostrados en la pantalla?
    • amigo, ¿dónde ir. ¿Por qué eliminar el comentario? jeje Ahora parece que me estoy hablando a mí mismo.
    • lo siento, no era correcto (Im entendido mal tu pregunta).
    • Oh. Así que cuando notifyDatasetChanged() es llamado, no llama getView() para la posición actual se muestran en el ListView, por lo refrescante de la corriente elementos que se muestran en caso de haber modificado exactamente esos ?
    • Erm, ¿se refiere a mí ? No creo que me hecho alguna de las anteriores comentarios en este post y eliminado. De todos modos, trate de agarrar un tutorial de la web acerca de listView personalizado y ver los pasos que he seguido, no ?
    • Y cuando usted llame notifyDatasetChanged() , se vuelve a dibujar la totalidad de la lista una vez más, y no sólo una vista en particular. En realidad, invalidate() también hace algo parecido a esto.
    • me quedé en listview problema puede usted ayudar?
    • Puedo intentar. 🙂
    • stackoverflow.com/questions/28122304/… aquí..mi problema
    • Me fui a través de la pregunta. Parece que ya han implementado alguien responda. Podría usted especificar cuál es el problema ahora?
    • Eso es exactamente lo que estoy tratando de hacer, pero no sé cómo. Se puede dar una respuesta? stackoverflow.com/questions/35098789/listview-arraylist/…

  4. 0

    Como ampliación de BaseAdapter para su propio para la creación de una subclase, obtendrá notifyDataSetChanged() método así.

Dejar respuesta

Please enter your comment!
Please enter your name here