如何异步填充列表视图?

时间:2011-05-11 17:07:19

标签: android listview listadapter

我想知道如何实现将ListAdapter异步加载到ListView的{​​{1}}?我想这样做是因为我使用来自我的数据库的信息填充列表,这使得我的活动有时加载有点慢。

6 个答案:

答案 0 :(得分:19)

您可以使用AsyncTask并使用onPostExecute方法发布新加载的结果:

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

答案 1 :(得分:5)

到目前为止,我见过的最佳方法是CommonsWare。在相关的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();
    }
  }
}

答案 2 :(得分:3)

最简单的方法是使用AsyncTask进行加载并在加载每个项目时调用publishProgress(或者,如果要加载所有项目并让它们一次显示,请更新{ {1}}

答案 3 :(得分:1)

.notifyDataSetChanged()可能是你追求的吗?每次向支持ArrayAdapter的列表中添加新项时,都可以在该适配器实例上调用.notifyDataSetChanged()来告诉它刷新。这样,ListView可以逐渐构建并显示每个项目,因为它们已添加到列表中。

答案 4 :(得分:0)

使用AsyncTask.这可以帮助您在后台检索数据。

答案 5 :(得分:0)

使用Kotlin和Kotlin扩展库,这项任务变得更加容易。您可以在名为Anko的库中使用doAsync / uiThread构造,只需使用一小部分代码。在下面的链接教程中,我使用此库来填充ListView,其中股票报价与Kotlin异步调用REST API。 Kotlin完全集成到Android Studio中:

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