2011-05-11 15 views

Respuesta

18

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

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); 
    } 
} 
+0

¡gracias! intentaré esto cuando vuelva a trabajar mañana :) no había pensado en hacerlo de esta manera –

+0

Hola, ¿qué tipo de adaptador puede ser claro o agregar elemento? – Hamidreza

0

Use AsyncTask. Eso puede ayudarlo a recuperar sus datos en segundo plano.

+0

utilizo AsyncTasks frecuencia, pero ¿Cómo se implementa en un listadapter? Estoy intentando crear una lista donde se muestre una vista cuando termine de cargarse. El uso de una asynctask para establecer un adaptador de lista cargará toda la lista en el fondo y luego mostrará la información. Estoy buscando una implementación que cargue un elemento de la lista a la vez y lo muestre en la lista. –

3

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

1

Es posible que .notifyDataSetChanged() sea lo que está buscando. Cada vez que agrega un nuevo elemento a la lista que respalda ArrayAdapter, puede llamar a .notifyDataSetChanged() en esa instancia de adaptador para indicarle que actualice. De esta forma, su ListView puede acumule y muestre gradualmente cada elemento a medida que se agregan a la lista.

5

El mejor método que he visto hasta ahora es de CommonsWare. Se encontró en este relacionado answer.

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

Con Kotlin y las bibliotecas de extensión Kotlin, esta tarea ha conseguido manera más fácil. Puede usar la construcción doAsync/uiThread en una biblioteca llamada Anko con una fracción del código. En el tutorial de enlaces a continuación, utilizo esta biblioteca para completar un ListView con comillas que llaman a una API REST de forma asincrónica con Kotlin. Kotlin está totalmente integrado en Android Estudio:

http://www.todroid.com/creating-a-stock-pricing-application-with-kotlin-for-android/

Cuestiones relacionadas