7

Necesito rellenar un largo ListView con datos de la red, digamos 2-3 segundos para toda la colección de datos. No quiero que el usuario vea una carga Dialog y espere a que se descargue la lista completa. En su lugar, deseo actualizar el ListView a medida que cada elemento esté disponible.¿Cómo puedo agregar filas a una vista de lista de forma asincrónica?

  • ¿Cómo puedo hacer esto?
  • Supongo que agregando al ArrayAdapter desde un AsyncTask con OnProgressUpdate?
  • ¿Tengo que emitir un notifyDatasetChanged() después de cada fila agregada?
  • ¿Es el enfoque Fragment/Loader mejor?
  • ¿Hay algún tutorial o implementación de referencia de demostración de API para un caso de esta manera?

No es importante que los datos se fue a buscar en su totalidad antes de que los Activity matrices (es decir Service es innecesario)

+0

uso de un ListFragment biblioteca de soporte, mira muestras, almacenar en caché los datos en un campo privado, llame notifyDatasetChanged cuando un nuevo elemento está listo – sherpya

+0

Definir "poco a poco". ¿Estás buscando en un intervalo grande o es una gran descarga en sí? –

Respuesta

3

El mejor enfoque que he visto hasta ahora es CommonsWare. Se encontró en este relacionado answer.

Aparentemente no hay nada de malo en llamar al add sin 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(); 
    } 
    } 
} 
0

Creo que se puede comenzar aquí: http://www.vogella.com/articles/AndroidPerformance/article.html

Por lo tanto, es necesario hacer una llamada asincrónica a un servidor de datos. O puede ejecutar una tarea en segundo plano para eso.

Puede buscar AsyncTask en Google o busque aquí en stackoverflow eso. Aquí es ejemplo: AsyncTask Android example

+0

¿Cuál de estos dos enlaces muestra cómo agregar filas individuales de forma asíncrona, en lugar de esperar hasta que se hayan completado todas las filas? No veo nada sobre ninguno de estos enlaces que responda la pregunta. –

+0

En enlaces hay información, cómo hacer un trabajo en el hilo de fondo. Y hay algo de información, cómo actualizar la GUI. No puede actualizar los elementos de GUI desde el hilo de fondo. En el segundo enlace está el ejemplo con TextView. – Guntis

0

sólo para asegurarse, ListView 's adapter ni sus datos subyacentes no pueden ser actualizados a partir de hilos que no sea el hilo de interfaz de usuario. Las actualizaciones se deben ejecutar en el hilo principal de la aplicación. Los subprocesos no UI pueden usar post() o runOnUiThread(), etc. para invocar una actualización.

Llamar a notifyDatasetChanged() al igual que no es una buena práctica, debe ser llamado por el propio Adapter o por el objeto que cambia los datos.

Como el funcionamiento de la red es lento, considere si no sería conveniente almacenar los datos descargados en database. De lo que termina con la implementación de algún tipo de CursorAdapter, mejor con el uso de Loader, de modo que cuando actualice database en su hilo de trabajo, ListView recibirá una notificación automática sobre los cambios.

+0

Pregunto específicamente sobre la visualización de los datos y la actualización de 'ListView' a medida que esté disponible, sin recopilarlos por adelantado y almacenarlos. –

+0

Cuando su artículo esté disponible lo inserta en 'database' y' ListView' se notificará sobre el cambio, en este caso que se agregó el elemento mencionado, a menos que no esté insertando todos los artículos en una transacción. – biegleux

Cuestiones relacionadas