Comment puis-je ajouter des lignes à une liste de manière asynchrone?

J'ai besoin de remplir une longue ListView avec des données du réseau, disons 2-3 secondes pour toute la collecte de données. Je ne souhaite pas que l'utilisateur visualise une Dialog chargement et attende le téléchargement complet de la liste. Au lieu de cela, je souhaite mettre à jour le ListView mesure que chaque élément devient disponible.

  • Comment puis-je faire ceci?
  • Je présume en ajoutant à ArrayAdapter partir d'un AsyncTask avec OnProgressUpdate ?
  • Dois-je émettre une notifyDatasetChanged() après chaque ligne ajoutée?
  • L'approche Fragment / Loader meilleure?
  • Existe-t-il un tutoriel ou une implémentation de référence de démonstration API pour un cas comme celui-ci?

Il n'est pas important que les données soient achevées avant que l' Activity découle (c'est-à-dire que le Service n'est pas nécessaire)

  • Arrêtez le softkeyboard Android à partir de l'achèvement du mot
  • Comment puis-je obtenir les deux nombres IMEI à partir de SIM SIM double?
  • Comment transmettre des données et ouvrir une activité à partir du Widget?
  • YouTube api: Non connecté. Appelez se connecter () et attendez que onConnected () soit appelé
  • Imposer la rotation de l'image avec la limite d'écran dans la classe ci-dessous
  • Méthode applicationTransformation non invoquée dans l'animation personnalisée
  • Les packages de modules non trouvés au moment de la compilation dans IntelliJ
  • Application de diffusion vidéo en direct sur Android
  • Comment émettre par programme un événement de clic sur Android
  • L'application Android Wear n'installe pas le combiné
  • La classe doit être déclarée abstraite ou mettre en œuvre une méthode abstraite
  • Comment faire pour copier les fichiers sélectionnés depuis Android avec Adb Pull
  • 3 Solutions collect form web for “Comment puis-je ajouter des lignes à une liste de manière asynchrone?”

    La meilleure approche que j'ai vue jusqu'ici est de CommonsWare . Il a été trouvé dans cette réponse connexe.

    Apparemment, il n'y a rien de mal à appeler add sans notifyDatasetChanged() .

     public class AsyncDemo extends ListActivity { private static final String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "arcu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, new ArrayList<String>())); new AddStringTask().execute(); } class AddStringTask extends AsyncTask<Void, String, Void> { @Override protected Void doInBackground(Void... unused) { for (String item : items) { publishProgress(item); SystemClock.sleep(200); } return(null); } @Override protected void onProgressUpdate(String... item) { ((ArrayAdapter<String>)getListAdapter()).add(item[0]); } @Override protected void onPostExecute(Void unused) { Toast .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT) .show(); } } } 

    Juste pour être sûr, l' adapter ListView ni ses données sous-jacentes ne peuvent pas être mis à jour à partir d'un thread autre que le thread UI. Les mises à jour doivent être exécutées sur le thread d'application principal. Les threads non UI peuvent utiliser post() ou runOnUiThread() , etc. pour invoquer une mise à jour.

    En appelant notifyDatasetChanged() ce n'est pas une bonne pratique, il doit être appelé par l' Adapter lui-même ou l'objet modifiant les données.

    Comme l'opération du réseau est lente, considérez qu'il ne serait pas souhaitable de stocker les données téléchargées dans la database de database . Que vous CursorAdapter avec la mise en œuvre d'une sorte de CursorAdapter , le meilleur avec l'utilisation de Loader , de sorte que lorsque vous mettez à jour la database de database dans votre fil de travail, ListView sera automatiquement notifié sur les modifications.

    Je pense que vous pouvez commencer ici: http://www.vogella.com/articles/AndroidPerformance/article.html

    Donc, vous devez faire un appel asynchrone sur un serveur pour les données. Ou vous pouvez exécuter une tâche de fond pour cela.

    Vous pouvez Google pour AsyncTask ou rechercher ici sur stackoverflow qui. Voici un exemple: exemple AsyncTask Android

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.