Android Array Adapter avec ArrayList et ListView ne se met pas à jour lorsque l'arraylist est modifié

J'ai une application Android avec un écran qui comprend un ListView, que j'utilise pour afficher une liste de périphériques. Ces dispositifs sont conservés dans un tableau.

J'essaie d'utiliser ArrayAdapter pour afficher ce qui se trouve dans le tableau sur l'écran dans une liste.

  • Comment changer la couleur d'arrière-plan du bouton de basculement sur Android
  • Quel est le mode de sélection de sélection modal?
  • Une application Android peut-elle se connecter directement à une base de données mysql en ligne
  • Comment forcer une vidéo à jouer en plein écran dans le lecteur de Youtube?
  • Comment créer une application Android qui dépend d'une autre application?
  • Relations One-To-Many dans ORMLite Android
  • Il fonctionne quand je charge d'abord la classe SetupActivity ; cependant, il est possible d'ajouter un nouvel appareil dans la méthode addDevice () , ce qui signifie que le réseau qui tient les périphériques est mis à jour.

    J'utilise notifyDataSetChanged () qui est censé mettre à jour la liste, mais cela ne semble pas fonctionner.

    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 } } 

    Est-ce que quelqu'un peut voir où je vais mal?

  • Maven vs Ant pour les versions automatiques dans les applications Android
  • Comment épingler deux boutons sous la barre d'outils en faisant défiler
  • Contexte d'activité de finition Android
  • N'a pas trouvé de classe "android.support.multidex.MultiDexApplication" sur le chemin d'accès: DexPathList
  • Pourquoi la toile n'est-elle pas de la même taille que celle de OnDraw? (Android)
  • Comment monter le fichier img Android sous Linux?
  • 3 Solutions collect form web for “Android Array Adapter avec ArrayList et ListView ne se met pas à jour lorsque l'arraylist est modifié”

    Pour un ArrayAdapter, notifyDataSetChanged ne fonctionne que si vous utilisez les fonctions add , insert , remove et clear l'adaptateur.

    1. Utilisez clair pour effacer l'adaptateur – arrayAdapter.clear()
    2. Utilisez Adapter.add et ajoutez la liste nouvellement formée – arrayAdapter.add(deviceList)
    3. Appelez notifyDataSetChanged

    Alternatives:

    1. Répétez cette étape après la formation d'une nouvelle dévidoir – mais ceci est redondant

       arrayAdapter = new ArrayAdapter<Device>(this, android.R.layout.simple_list_item_1, deviceList); 
    2. Créez votre propre classe dérivée de BaseAdapter et ListAdapter qui vous offre plus de flexibilité. Ceci est le plus recommandé.

    Alors que la réponse acceptée résout le problème, l'explication de pourquoi est incorrecte, et comme c'est un concept important, je pensais essayer de clarifier. L'explication de Slartibartfast qui notifyDataSetChanged() ne fonctionne que lors de l' add , l' insert , la remove ou l' clear est appelée sur l'adaptateur incorrect. Cette explication est vraie pour la méthode setNotifyOnChange() qui, si elle est définie sur true (comme elle l'est par défaut), appellera automatiquement notifyDataSetChanged() lorsque l'une de ces quatre actions se produit. Je pense que l'affiche a confondu les deux méthodes. notifyDatasetChanged() lui-même n'a pas ces restrictions. Il dit simplement à l'adaptateur que la liste qu'il regarde a changé, et peu importe la façon dont la modification de la liste s'est effectivement produite. Bien que je ne voie pas le code source de votre createNewDeviceList() , je suppose que votre problème est venu du fait que vous aviez l'adaptateur référençant la liste d'origine que vous avez créée et que vous avez créé une nouvelle liste dans createNewDeviceList() et depuis La carte indiquait toujours l'ancienne liste qu'il ne pouvait pas voir les modifications. La solution slartibartfast mentionnée fonctionne car elle efface l'adaptateur et ajoute spécifiquement la liste mise à jour à cet adaptateur. Ainsi, vous n'avez pas le problème de votre adaptateur indiquant le mauvais endroit. J'espère que cela aide quelqu'un!

    Votre méthode addDevice provoque une boucle sans fin. N'appelez pas une méthode à partir de vous-même comme vous le faites ici:

     deviceList = addDevice(); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.