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.
- Parece java clase estática interna, pero al parecer no es (no lo entiendo, ¿cómo es esto posible?)
- ¿Cómo recuperar una lista de fuentes disponibles / instaladas en android?
- Cómo detener la serie de controladores postDelayed
- Java.lang.ClassCastException: android.widget.LinearLayout no se puede convertir en android.widget.ListView
- Mediante la consulta Sqlite, obtenga una fecha de milisegundos almacenados
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?
- Cómo borrar la memoria del montón de eclipse
- Android - Barcode Scanning, Opciones? Zxing?
- Datos de paso de Android entre Fragmentos
- Sincronizar el PoolingClientConnectionManager o no
- Se muestra Google Maps Android sólo pantalla en blanco
- Cómo mostrar el lunes como primer día CalendarView
- ¿Qué significa realmente el estado del hilo de Java?
- Cómo contar la velocidad basada en pasos
Para un ArrayAdapter, notifyDataSetChanged
sólo funciona si utiliza las funciones de add
, insert
, remove
y clear
en el adaptador.
- Utilice clear para borrar el adaptador –
arrayAdapter.clear()
- Utilice Adapter.add y agregue la lista recién formada –
arrayAdapter.add(deviceList)
- Llamar notifyDataSetChanged
Alternativas:
-
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);
- 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();
- Cómo hacer que las aplicaciones de Android sean accesibles (para personas con discapacidades) con PhoneGap
- ¿Alguien ha conseguido que el seguimiento de campañas de seguimiento de canales de Google Play (UTM) funcione?