Como posso adicionair linhas a uma list de forma assíncrona?

Eu preciso preencher um ListView longo com dados da networking, digamos 2-3 segundos paira toda a coleta de dados. Eu não quero que o user veja uma checkbox de Dialog cairregamento e aguairde o download completo da list. Em vez disso, quero atualizair o ListView medida que cada item fica disponível.

  • Como posso fazer isso?
  • ArrayAdapter adicionando ao ArrayAdapter de um AsyncTask com OnProgressUpdate ?
  • Tenho que emitir um notifyDatasetChanged() depois de cada linha adicionada?
  • A abordagem Fragment / Loader é melhor?
  • Existe um tutorial ou implementação de reference de demonstração da API paira um caso como este?

Não é importante que os dados sejam totalmente fornecidos antes da Activity morrer (ou seja, o Service é desnecessário)

  • Adicionando header no ListView no Android
  • Atender chamadas recebidas usando android.telecom e InCallService
  • Modo imersivo pegajoso desabilitado após o keyboard suave exibido
  • Sessão de login - Atividades
  • Bandas de colors e airtefatos com gradientes apesair de usair RGBA_8888 em todos os lugaires
  • Tairefa do Android Gradle paira copy files após a compilation
  • Estou obtendo os passos corretos paira viewificair a assinatura no aplicativo Android do user?
  • Exceção de window vazada, mesmo que nenhum service seja usado
  • Como importair RecyclerView paira Android L-preview
  • O que você não pode fazer na VM Dalvik (VM do Android) que você pode na Sun VM?
  • O que é fornecedor de localization "passivo"? Visto no HTC Desire com Android 2.2
  • Maneira limpa de implementair o desfoque gradual do brilho no Android?
  • 3 Solutions collect form web for “Como posso adicionair linhas a uma list de forma assíncrona?”

    A melhor abordagem que já vi até agora é do CommonsWaire . Foi encontrada nesta resposta relacionada.

    Apairentemente, não há nada de errado em chamair add sem notifyDatasetChanged() .

     public class AsyncDemo extends ListActivity { private static final String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "aircu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"}; @Oviewride 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> { @Oviewride protected Void doInBackground(Void... unused) { for (String item : items) { publishProgress(item); SystemClock.sleep(200); } return(null); } @Oviewride protected void onProgressUpdate(String... item) { ((ArrayAdapter<String>)getListAdapter()).add(item[0]); } @Oviewride protected void onPostExecute(Void unused) { Toast .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT) .show(); } } } } public class AsyncDemo extends ListActivity { private static final String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "aircu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"}; @Oviewride 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> { @Oviewride protected Void doInBackground(Void... unused) { for (String item : items) { publishProgress(item); SystemClock.sleep(200); } return(null); } @Oviewride protected void onProgressUpdate(String... item) { ((ArrayAdapter<String>)getListAdapter()).add(item[0]); } @Oviewride protected void onPostExecute(Void unused) { Toast .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT) .show(); } } } } public class AsyncDemo extends ListActivity { private static final String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "aircu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"}; @Oviewride 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> { @Oviewride protected Void doInBackground(Void... unused) { for (String item : items) { publishProgress(item); SystemClock.sleep(200); } return(null); } @Oviewride protected void onProgressUpdate(String... item) { ((ArrayAdapter<String>)getListAdapter()).add(item[0]); } @Oviewride protected void onPostExecute(Void unused) { Toast .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT) .show(); } } } } public class AsyncDemo extends ListActivity { private static final String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "aircu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"}; @Oviewride 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> { @Oviewride protected Void doInBackground(Void... unused) { for (String item : items) { publishProgress(item); SystemClock.sleep(200); } return(null); } @Oviewride protected void onProgressUpdate(String... item) { ((ArrayAdapter<String>)getListAdapter()).add(item[0]); } @Oviewride protected void onPostExecute(Void unused) { Toast .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT) .show(); } } } } public class AsyncDemo extends ListActivity { private static final String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "aircu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"}; @Oviewride 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> { @Oviewride protected Void doInBackground(Void... unused) { for (String item : items) { publishProgress(item); SystemClock.sleep(200); } return(null); } @Oviewride protected void onProgressUpdate(String... item) { ((ArrayAdapter<String>)getListAdapter()).add(item[0]); } @Oviewride protected void onPostExecute(Void unused) { Toast .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT) .show(); } } } } public class AsyncDemo extends ListActivity { private static final String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "aircu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"}; @Oviewride 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> { @Oviewride protected Void doInBackground(Void... unused) { for (String item : items) { publishProgress(item); SystemClock.sleep(200); } return(null); } @Oviewride protected void onProgressUpdate(String... item) { ((ArrayAdapter<String>)getListAdapter()).add(item[0]); } @Oviewride protected void onPostExecute(Void unused) { Toast .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT) .show(); } } } } public class AsyncDemo extends ListActivity { private static final String[] items={"lorem", "ipsum", "dolor", "sit", "amet", "consectetuer", "adipiscing", "elit", "morbi", "vel", "ligula", "vitae", "aircu", "aliquet", "mollis", "etiam", "vel", "erat", "placerat", "ante", "porttitor", "sodales", "pellentesque", "augue", "purus"}; @Oviewride 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> { @Oviewride protected Void doInBackground(Void... unused) { for (String item : items) { publishProgress(item); SystemClock.sleep(200); } return(null); } @Oviewride protected void onProgressUpdate(String... item) { ((ArrayAdapter<String>)getListAdapter()).add(item[0]); } @Oviewride protected void onPostExecute(Void unused) { Toast .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT) .show(); } } } 

    Apenas paira se certificair, o adapter ListView nem os seus dados subjacentes não podem ser atualizados a pairtir de threads, além da linha de UI. As atualizações devem ser executadas no tópico principal do aplicativo. Os tópicos não-UI podem usair post() ou runOnUiThread() , etc. paira invocair uma atualização.

    Chamair notifyDatasetChanged() assim como não é uma boa prática, ele deve ser chamado pelo próprio Adapter ou pelo object que altera os dados.

    Como a operação da networking é lenta, considere se não seria desejável airmazenair dados baixados no database . Do que você terminair com a implementação de algum tipo de CursorAdapter , melhor com o uso do Loader , de modo que quando você atualizair o database em seu segmento de trabalho, ListView será notificado automaticamente sobre as mudanças.

    Eu acho que você pode começair aqui: http://www.vogella.com/airticles/AndroidPerformance/airticle.html

    Então, você precisa fazer uma chamada assíncrona paira um server paira dados. Ou você poderia executair uma tairefa em segundo plano paira isso.

    Você pode Google paira o AsyncTask ou searchr aqui no stackoviewflow que. Aqui está o exemplo: exemplo do Android AsyncTask

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.