如何asynchronous填充列表视图?

我想知道我应该如何实现一个ListAdapter加载其视图asynchronous到一个ListView ? 我想这样做是因为我用来自我的数据库的信息来填充列表,这使得我的活动时间有点慢。

Solutions Collecting From Web of "如何asynchronous填充列表视图?"

您可以使用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); } } 

我目前看到的最好的方法是从CommonsWare 。 这是在这个相关的答案 。

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

最简单的事情是使用一个AsyncTask来加载并调用publishProgress作为每个项目被加载(或者,如果你想加载所有的项目,并让他们一次出现,更新UI onPostExecute

是.notifyDataSetChanged()可能是什么后? 每次将新项目添加到支持ArrayAdapter的列表中时,都可以在该适配器实例上调用.notifyDataSetChanged()以使其刷新。 通过这种方式,ListView可以逐渐build立并显示添加到列表中的每个项目。

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

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

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