Cómo rellenar un listview asincrónicamente?

Me pregunto cómo debo implementar un ListAdapter que carga sus vistas asincrónicamente en un ListView ? Quiero hacer esto porque estoy poblando la lista con información de mi base de datos, que está haciendo mi actividad un poco lenta para cargar a veces.

Puede utilizar un AsyncTask y utilizar los métodos onPostExecute para publicar los resultados recién cargados:

 private ArrayAdapter adapter = new YourArrayAdapter(); private class YourAsyncTask extends AsyncTask<Void, Void, List<YourItem>> { @Override protected void onPreExecute() { // start loading animation maybe? adapter.clear(); // clear "old" entries (optional) } @Override protected List<YourItem> doInBackground(Void... params) { // everything in here gets executed in a separate thread return DataBase.getItems(); } @Override protected void onPostExecute(List<YourItem> items) { // stop the loading animation or something adapter.addAll(items); } } 

El mejor enfoque que he visto hasta ahora es de CommonsWare . Se encontró en esta respuesta relacionada.

 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(); } } } 

Lo más fácil es utilizar un AsyncTask para realizar la carga y llamar a publishProgress medida que se carga cada elemento (o, si desea cargar todos los elementos y hacer que aparezcan todos a la vez, actualice la interfaz de usuario en onPostExecute

¿Es .notifyDataSetChanged () posiblemente lo que buscas? Cada vez que agrega un elemento nuevo a la lista que respalda el ArrayAdapter, puede llamar a .notifyDataSetChanged () en esa instancia del adaptador para indicarle que actualice. De esta forma, su ListView puede aumentar gradualmente y mostrar cada elemento a medida que se agregan a la lista.

Utilice AsyncTask. Eso puede ayudarle a recuperar sus datos en segundo plano.

  • SimpleCursorAdapter con Secciones en Android
  • ¿Cómo puedo usar layout_weight en RecyclerView o Vista de elemento ListView para que los elementos de igual altura llenen el espacio disponible en la pantalla?
  • Android: eventos duplicados de ListView
  • Cómo obtener el contexto en getView del adaptador para listview
  • El elemento se vuelve más grande al deslizar ListView
  • Barra de Acción de Android Buscar con listview
  • No detener la animación en listview
  • No puedo hacer que mi ListView sea seleccionable, al pulsar el elemento no se resalta
  • Android: ¿Los elementos de las listas no se vuelven naranjas cuando se hace clic?
  • Adaptador de actualización de animación ListView android
  • ¿Cómo puedo quitar el teclado después de terminar una actividad?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.