Adaptador de matriz de Android con ArrayList y ListView no se actualizan cuando se cambia el arraylist

Tengo una aplicación de Android con una pantalla que se compone de un ListView, que estoy utilizando para mostrar una lista de dispositivos. Estos dispositivos se mantienen en una matriz.

Estoy intentando utilizar el ArrayAdapter para exhibir cuál está en la matriz en la pantalla en una lista.

Funciona cuando carga por primera vez la clase SetupActivity , sin embargo, existe la posibilidad de agregar un nuevo dispositivo en el método addDevice () , lo que significa que la matriz que contiene los dispositivos se actualiza.

Estoy utilizando notifyDataSetChanged () que se supone que para actualizar la lista, pero no parece funcionar.

public class SetupActivity extends Activity { private ArrayList<Device> deviceList; private ArrayAdapter<Device> arrayAdapter; private ListView listView; private DevicesAdapter devicesAdapter; private Context context; public void onCreate(Bundle savedInstanceState) //Method run when the activity is created { super.onCreate(savedInstanceState); setContentView(R.layout.setup); //Set the layout context = getApplicationContext(); //Get the screen listView = (ListView)findViewById(R.id.listView); deviceList = new ArrayList<Device>(); deviceList = populateDeviceList(); //Get all the devices into the list arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList); listView.setAdapter(arrayAdapter); } protected void addDevice() //Add device Method (Simplified) { deviceList = createNewDeviceList(); //Add device to the list and returns an updated list arrayAdapter.notifyDataSetChanged(); //Update the list } } 

¿Alguien puede ver dónde me equivoco?

Para un ArrayAdapter, notifyDataSetChanged sólo funciona si utiliza las funciones de add , insert , remove y clear en el adaptador.

  1. Utilice clear para borrar el adaptador – arrayAdapter.clear()
  2. Utilice Adapter.add y agregue la lista recién formada – arrayAdapter.add(deviceList)
  3. Llamar notifyDataSetChanged

Alternativas:

  1. Repita este paso después de que se forme la nueva línea de distribución – pero esto es redundante

     arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList); 
  2. Cree su propia clase derivada de BaseAdapter y ListAdapter que le da más flexibilidad. Esto es muy recomendable.

Mientras que la respuesta aceptada resuelve el problema, la explicación de porqué es incorrecta, y puesto que éste es un concepto importante que pensé intentar aclarar. La explicación de Slartibartfast de que notifyDataSetChanged() sólo funciona cuando se add , insert , remove o se clear es llamada en el adaptador es incorrecta. Esta explicación es válida para el método setNotifyOnChange() , que si se establece en true (como es por defecto) llamará automáticamente notifyDataSetChanged() cuando se notifyDataSetChanged() cualquiera de esas cuatro acciones. Creo que el cartel confundió los dos métodos. notifyDatasetChanged() no tiene esas restricciones. Sólo le dice al adaptador que la lista que está buscando ha cambiado, y no importa cómo el cambio a la lista realmente sucedió. Aunque no puedo ver el código fuente de su createNewDeviceList() , supongo que su problema provenía del hecho de que tenía el adaptador haciendo referencia a la lista original que creó, y luego creó una nueva lista en createNewDeviceList() , y desde El adaptador seguía apuntando a la lista antigua que no podía ver los cambios. La solución que slartibartfast mencionó funciona porque elimina el adaptador y añade específicamente la lista actualizada a ese adaptador. Por lo tanto, usted no tiene el problema de su adaptador apuntando al lugar equivocado. Espero que esto ayude a alguien!

Su método addDevice está causando un bucle sin fin. No llame a un método de sí mismo como lo está haciendo aquí:

 deviceList = addDevice(); 
  • Diferencia entre SparseArray Vs ArrayList?
  • Cómo enviar datos al servidor en android
  • Acceso al campo local vs campo de objeto. ¿Está mal el documento?
  • No se invoca el método Java cuando se llama desde pthread nativo
  • Actividad que se crea dos veces en android
  • Sqlite - en rebaja
  • Cómo agregar funcionalidad de flecha de botón Volver en barra de navegación
  • Modelos de fachadas y clases de Managers
  • Cargando muchas imágenes del servidor en Android
  • Error: Error de ejecución para la tarea ': app: transformClassesWithMultidexlistForDebug'
  • Cómo agregar una sombra y un borde en circular imageView android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.