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.

  • Guardar y volver a cargar ListView utilizando las preferencias compartidas
  • Sugerencias para crear un control de árbol en Android
  • Obtener el elemento seleccionado de customadapter listview Android
  • Cómo definir ColorStateList para TextView?
  • Cómo llamar a notifyDataSetChanged () desde un adaptador genérico
  • No detener la animación en listview
  • Listview no se actualiza con notifydatasetchanged () llamada
  • Cambiar el color de la barra de desplazamiento en Android
  • Android cómo modificar EditText editable dentro de un ListView
  • Android: Múltiples temporizadores de cuenta atrás simultáneos en un ListView
  • ListView subobject clicable confilct
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.