studio elementos dinamico con botones arrayadapter agregar java android android-activity android-listview android-arrayadapter

java - elementos - listview con botones android studio



Android Array Adapter con ArrayList y ListView no se actualiza cuando se cambia el arraylist (3)

Para un ArrayAdapter, notifyDataSetChanged solo funciona si usa las funciones de add , insert , remove y clear en el Adaptador.

  1. Use 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 una nueva lista de expertos, 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 brinde más flexibilidad. Esto es lo más recomendado.

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

Estoy tratando de usar el ArrayAdapter para mostrar lo que 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 actualiza la lista, pero parece que no funciona.

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 estoy yendo mal?


su método addDevice está causando un bucle infinito. No invoque un método de sí mismo como lo hace aquí:

deviceList = addDevice();


Si bien la respuesta aceptada resuelve el problema, la explicación de por qué es incorrecta, y dado que este es un concepto importante que pensé que intentaría aclarar. La explicación de Slartibartfast de que notifyDataSetChanged() solo funciona cuando se llama add , insert , remove o clear en el adaptador es incorrecta. Esa explicación es cierta para el método setNotifyOnChange() , que si se establece en verdadero (como lo es por defecto) llamará automáticamente a notifyDataSetChanged() cuando notifyDataSetChanged() cualquiera de esas cuatro acciones. Creo que el cartel confundió los dos métodos. notifyDatasetChanged() sí mismo no tiene esas restricciones. Simplemente le dice al adaptador que la lista que está mirando ha cambiado, y no importa cómo sucedió realmente el cambio en la lista. Aunque no puedo ver el código fuente de createNewDeviceList() , supongo que su problema proviene 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 aún apuntaba a la lista anterior, no podía ver los cambios. La solución que menciona slartibartfast funciona porque borra el adaptador y específicamente agrega la lista actualizada a ese adaptador. Por lo tanto, no tiene el problema de que su adaptador apunte al lugar equivocado. ¡Espero que esto ayude a alguien!