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.

  • Publier une demande multipartite avec Android SDK
  • Comment tachez-vous un bitmap dans Android?
  • AAPT échouant avec le code d'erreur -1073741819
  • OnActivityResult n'est pas appelé dans Fragment
  • Adb transfère le fichier avec une vitesse très lente
  • Lien de l'événement tactile Android WebView
  • 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?

  • Comment centrer la mise en page dans la boîte de dialogue Android?
  • Point de pivotement de réglage Android pour l'animation à l'échelle
  • La barre de progression du cercle indéterminé sur Android est blanche, malgré la couleur colorée
  • Android Studio 2.3 Beta 1 + Support 25.1.0 = Aperçu cassé
  • Capture du trafic de téléphonie mobile sur wireshark
  • "Les composants SDK suivants n'ont pas été installés: sys-img-x86-addon-google_apis-google-22 et addon-google_apis-google-22"
  • 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.