¿Por qué no "notifyDatasetChanged ()" notifica todos los elementos visibles?

Fondo

Nota: He estado usando listViews por años, así que estoy muy familiarizado con cómo trabajar con adaptadores, ViewHolders, etc … por lo que este problema no tiene sentido para mí.

Esta vez me metí en un comportamiento muy extraño que por alguna razón ocurren sólo en 2 dispositivos:

  1. LG G2, con Android 4.2.2

  2. Xperia J, con Android 4.1.2

El problema

El listView tiene su propio BaseAdapter, que en algunos eventos actualizo su colección de elementos dentro de él (en el subproceso de UI) y llama a notifyDatasetChanged ().

El problema es que en los dispositivos problemáticos, llamar a esta función llama a getView sólo en algunas de las filas visibles del listView. Por ejemplo, si las filas 1,2,3,4,5 son visibles, y llamo notifyDatasetChanged, y puse el registro en getView, puedo ver que va sobre 1,2,4,5 (fila saltada 3).

Algunas pistas

  • Siempre omite la fila que el usuario hace clic dentro de ella (cada fila tiene vistas que se pueden hacer clic) que dispara las llamadas notifyDatasetChanged.

  • Otros dispositivos manejan el listview muy bien: 2 dispositivos Nexus 4 (cada uno con una versión diferente), Galaxy S2 y Galaxy S4.

  • No importa si llamo a notifyDataSetChanged una o dos veces.

  • Aunque uso mi propio BaseAdapter, no cambié la forma en que funciona el ListView. No he extendido ListView.

  • Para la clase BaseAdapter, he superado las siguientes funciones:

    • GetViewTypeCount-devuelve 2
    • GetItemViewType – devuelve 0 o 1, dependiendo del tipo de la fila
    • GetCount
    • obtiene el objeto
    • GetItemId – No lo necesito, así que lo hice siempre devolver 0 (no ayudará a hacer que devuelva la posición en su lugar).
    • GetView
    • AreAllItemsEnabled y isEnabled – siempre devuelve false, ya que todas las filas tienen vistas inned que sólo necesitan manejar haciendo clic.

    Yo no anular ningún otro método. Por supuesto que creé funciones auxiliares, pero eso es todo.

La pregunta

¿Por qué ocurre?

¿Cómo es que se produce sólo a algunos dispositivos?

¿Como puedo resolver esto?

¿Es posible que sea un error en algunas roms?

Si es así, ¿hay una buena solución para esto, o debo realmente llamar a getView en la fila problemática (que funciona bien BTW, pero es sólo extraño que hago esto)?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.