7

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

  • 我怎样才能做到这一点?
  • 我假设通过添加到ArrayAdapterfrom an AsyncTaskwith OnProgressUpdate?
  • 我必须notifyDatasetChanged()在每添加一行后发出一个吗?
  • Fragment/Loader方法更好吗?
  • 是否有此类案例的教程或 API 演示参考实现?

Activity在死亡之前完全获取数据并不重要(即Service没有必要)

4

3 回答 3

3

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

显然没有调用没有addnotifyDatasetChanged()

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();
    }
  }
}
于 2012-08-18T04:39:32.510 回答
0

我想你可以从这里开始:http ://www.vogella.com/articles/AndroidPerformance/article.html

因此,您需要对服务器进行异步调用以获取数据。或者您可以为此运行后台任务。

你可以谷歌AsyncTask搜索或在 stackoverflow 上搜索。这是示例:AsyncTask Android 示例

于 2012-08-16T21:21:53.780 回答
0

只是为了确保ListView'sadapter及其底层数据不能从 UI 线程以外的线程更新。更新必须在主应用程序线程上执行。非 UI 线程可以使用post()orrunOnUiThread()等​​来调用更新。

像这样调用notifyDatasetChanged()不是很好的做法,它应该由它Adapter自己或改变数据的对象调用。

由于网络运行缓慢,请考虑是否不希望将下载的数据存储在database. CursorAdapter最后,您最好使用实现某种Loader,这样当您database在工作线程中更新时,ListView将自动收到有关更改的通知。

于 2012-08-16T22:01:18.440 回答