Estoy tratando de utilizar en mi Android Application
el notifyDataSetChanged()
método para una ArrayAdapter
pero no funciona para mí.
Encontré como respuesta aquí , que notifyDataSetChanged()
debería ejecutarse en el hilo principal, pero no había ningún ejemplo para eso.
¿Alguien podría enviar un ejemplo o al menos un enlace?
Respuestas:
Para una
ArrayAdapter
,notifyDataSetChanged
sólo funciona si se utiliza eladd()
,insert()
,remove()
, yclear()
en el adaptador.Cuando
ArrayAdapter
se construye un, contiene la referencia para loList
que se pasó. Si fuera a pasarList
un miembro de una Actividad, y cambiara ese miembro de la Actividad más adelante, elArrayAdapter
todavía tiene una referencia al originalList
. El adaptador no sabe que ha cambiado elList
en la actividad.Sus elecciones son:
ArrayAdapter
de modificar la Lista subyacente (add()
,insert()
,remove()
,clear()
, etc.)ArrayAdapter
con los nuevosList
datos. (Utiliza muchos recursos y recolección de basura).BaseAdapter
yListAdapter
que permita cambiar laList
estructura de datos subyacente .notifyDataSetChanged()
cada vez que se actualice la lista. Para llamarlo en el UI-Thread, use elrunOnUiThread()
deActivity
. Entonces,notifyDataSetChanged()
funcionará.fuente
notifyDataSetChanged()
de esa manera((BaseAdapter) arrayAdapter).notifyDataSetChanged();
:?Puede usar el
runOnUiThread()
método de la siguiente manera. Si no está utilizando unListActivity
, simplemente adapte el código para obtener una referencia a suArrayAdapter
.fuente
Recientemente escribí sobre este tema, aunque esta publicación es antigua, pensé que sería útil para alguien que quiera saber cómo implementar
BaseAdapter.notifyDataSetChanged()
paso a paso y de manera correcta.Siga Cómo implementar correctamente BaseAdapter.notifyDataSetChanged () en Android o el blog más reciente BaseAdapter.notifyDataSetChanged () .
fuente
mItem.add()
hacerlo, solo edité un elemento,mItem.get(position).setImage(encodedImage)
por lo que es posible que esté dando una excepción de error de puntero nulo. solo para add (), clear (), remove (), etc.Tuve el mismo problema y prefiero no reemplazar todo el ArrayAdapter con una nueva instancia continuamente. Por lo tanto, tengo el AdapterHelper haciendo el trabajo pesado en otro lugar.
Agregue esto donde normalmente (intente) llamar notificar
Clase AdapterHelper
fuente
super.addAll(..)
para API> 11 y super.add (.. ) en combinación con la iteración como la suya:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { super.addAll(items); } else { for (Object o : collection) { super.add(o); } }
. Ahora solo extiéndase de su nueva clase de adaptador.Sé que esta es una respuesta tardía, pero estaba enfrentando un problema similar y logré resolverlo usando
notifyDataSetChanged()
en el lugar correcto.Entonces mi situación fue la siguiente.
Tuve que actualizar una vista de lista en una pestaña de barra de acción (fragmento) con contenido devuelto de una actividad completamente diferente. Inicialmente, sin embargo, la vista de lista no reflejaría ningún cambio. Sin embargo, cuando hice clic en otra pestaña y luego volví a la pestaña deseada, la vista de lista se actualizaría con el contenido correcto de la otra actividad. Entonces para resolver esto usé
notifyDataSetChanged()
el adaptador de barra de acción en el código de la actividad que tenía que devolver los datos.Este es el fragmento de código que utilicé en la actividad.
Esta actividad devolvería algunos datos
FragmentTab2
y actualizaría directamente mi vista de lista enFragmentTab2
.¡Espero que alguien encuentre esto útil!
fuente