如何异步向列表视图添加行?

Jef*_*rod 7 android android-arrayadapter android-listview android-asynctask android-fragments

我需要填充ListView来自网络的数据,例如整个数据收集的2-3秒.我不希望用户看到加载Dialog并等待整个列表下载.相反,我希望在ListView每个项目可用时更新.

  • 我怎样才能做到这一点?
  • 我假设通过添加到ArrayAdapter一个AsyncTaskOnProgressUpdate
  • notifyDatasetChanged()每次添加行后是否必须发出?
  • Fragment/ Loader办法更好?
  • 对于这样的案例,是否有教程或API演示参考实现?

Activity模具之前完全取出数据并不重要(即Service不必要)

Jef*_*rod 3

到目前为止我见过的最好的方法来自CommonsWare在这个相关答案中找到了。

显然不带调用add没有任何问题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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)