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