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.
- Obtener el ID del elemento ListView seleccionado (datos rellenos con DB de SQLite)
- Vista Lista expandible - Childs, Diferentes diseños
- Cambiar el color de texto de ListView
- Android ListView Edge Fading funciona en un dispositivo virtual 2.2 pero no en Samsung 2.2.1
- Cómo hacer que el encabezado o pie de página de un ListView no se puede hacer clic
- Android ListView con OnItemClickListener Y GestureDetector
- Haga clic en la casilla de verificación de listItem
- Cómo actualizar lista personalizada usando baseadapter en android
- Android: onScrollStateChanged SCROLL_STATE_IDLE a veces no se dispara
- Cambiar la altura del divisor de listview dinámicamente?
- Deshabilitar elementos de vista de lista con selector y isEnabled ()
- Cómo hacer clickable en toda la fila de la vista de lista?
- Líneas de desplazamiento de borde azul de listview. Androide
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.