android - scanner - Ejemplo de notifyDataSetChanged
listview bluetooth android example (5)
Estoy intentando usar en mi Android Application el método notifyDataSetChanged() para un 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?
Para un ArrayAdapter , notifyDataSetChanged solo funciona si usa add() , insert() , remove() y clear() en el Adaptador.
Cuando se construye un ArrayAdapter , contiene la referencia para la List que se pasó. Si pasara una List que era miembro de una Actividad, y cambiara ese miembro de la Actividad más adelante, el ArrayAdapter todavía tiene una referencia al List original. El adaptador no sabe que cambió la List en la actividad.
Tus elecciones son:
- Use las funciones de
ArrayAdapterpara modificar la Lista subyacente (add(),insert(),remove(),clear(), etc.) - Vuelva a crear el
ArrayAdaptercon la nuevaListdatos. (Utiliza muchos recursos y recolección de basura). - Cree su propia clase derivada de
BaseAdapteryListAdapterque permita cambiar la estructura de datos de laListsubyacente. - Use
notifyDataSetChanged()cada vez que se actualice la lista. Para llamarlo en UI-Thread, userunOnUiThread()deActivity. Luego,notifyDataSetChanged()funcionará.
Puede usar el método runOnUiThread() siguiente manera. Si no está utilizando una ListActivity , simplemente adapte el código para obtener una referencia a su ArrayAdapter .
final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});
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 en el blog más nuevo BaseAdapter.notifyDataSetChanged () .
Sé que esta es una respuesta tardía, pero me enfrentaba a un problema similar y logré resolverlo utilizando notifyDataSetChanged() en el lugar correcto.
Entonces mi situación fue la siguiente.
Tuve que actualizar una vista de lista en una pestaña de la barra de acciones (fragmento) con los contenidos devueltos 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 regresé a la pestaña deseada, la vista de lista se actualizaría con el contenido correcto de la otra actividad. Entonces, para resolver esto, utilicé notifyDataSetChanged() del adaptador de barra de acciones 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.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{
case R.id.action_new_forward:
FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab
Intent ina = new Intent(getApplicationContext(), MainActivity.class);
ina.putExtra("stra", values1);
startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment).
}
}
Esta actividad devolvería algunos datos a FragmentTab2 y actualizaría directamente mi vista de lista en FragmentTab2 .
¡Espero que alguien encuentre esto útil!
Tuve el mismo problema y prefiero no reemplazar todo el ArrayAdapter con una nueva instancia continuamente. Por lo tanto, tengo el AdapterHelper hacer el trabajo pesado en otro lugar.
Agregue esto donde normalmente llamaría (intentaría) notificar
new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();
Clase de AdapterHelper
public class AdapterHelper {
@SuppressWarnings({ "rawtypes", "unchecked" })
public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
arrayAdapter.clear();
for (Object object : listOfObject){
arrayAdapter.add(object);
}
}
}