notifyDataSetChanged ejemplo


Estoy tratando de 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.

Podría alguien enviar un ejemplo o al menos un enlace?!

Author: Community, 2010-09-08

5 answers

Para una ArrayAdapter, notifyDataSetChanged sólo funciona si se utiliza el add(), insert(), remove(), y clear() en el Adaptador.

Cuando se construye un ArrayAdapter, contiene la referencia para el List que se pasó. Si tuviera que pasar un List que era un miembro de una Actividad, y cambiar ese miembro de Actividad más tarde, el ArrayAdapter todavía contiene una referencia al List original. El Adaptador no sabe que ha cambiado el List en la Actividad.

Sus opciones son:

  1. Utilice el funciones de la ArrayAdapter para modificar la Lista subyacente (add(), insert(), remove(), clear(), etc.)
  2. Vuelva a crear el ArrayAdapter con los nuevos datos List. (Utiliza una gran cantidad de recursos y recolección de basura.)
  3. Cree su propia clase derivada de BaseAdapter y ListAdapter que permita cambiar la estructura de datos subyacente List.
  4. Utilice el notifyDataSetChanged() cada vez que se actualice la lista. Para invocarlo en el subproceso UI, utilice el runOnUiThread() de Activity. Entonces, notifyDataSetChanged() funcionará.
 305
Author: jnosek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-03 07:11:05

Puede utilizar el runOnUiThread() método como sigue. Si no estás usando un ListActivity, simplemente adapta el código para obtener una referencia a tu ArrayAdapter.

final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});
 28
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-30 16:31:23

Recientemente escribí sobre este tema, aunque este post es antiguo, pensé que sería útil para alguien que quiere saber cómo implementar BaseAdapter.notifyDataSetChanged() paso a paso y de una manera correcta.

Por favor, siga Cómo implementar correctamente BaseAdapter.notifyDataSetChanged () en Android o el nuevo blog BaseAdapter.notifyDataSetChanged () .

 9
Author: Arif Nadeem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-15 11:14:52

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 (intentaría) llamar a notify

new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();

Clase AdapterHelper

public class AdapterHelper {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
        arrayAdapter.clear();
        for (Object object : listOfObject){
            arrayAdapter.add(object);
        }
    }
}
 6
Author: Kevin Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-13 21:08:11

Sé que esta es una respuesta tardía, pero me enfrentaba a un problema similar y me las arreglé para resolverlo utilizando notifyDataSetChanged() en el lugar correcto.

Así que mi situación era la siguiente.

Tuve que actualizar una vista de lista en una pestaña de la barra de acciones (fragmento) con el contenido devuelto de una actividad completamente diferente. Inicialmente, sin embargo, el listview no reflejaría ningún cambio. Sin embargo, cuando hice clic en otra pestaña y luego regresé a la pestaña deseada, el listview se actualizaría con el contenido correcto de la otra actividad. Así que para resolver esto usé 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 listview en FragmentTab2.

Espero que alguien encuentre esto útil!

 2
Author: mutp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-30 16:32:24