我想知道我应该如何实现一个ListAdapter
异步加载其视图到ListView
?我想这样做是因为我使用来自数据库的信息来填充列表,这使得我的活动时间有点慢。如何异步填充列表视图?
回答
您可以使用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);
}
}
使用AsyncTask.
这可以帮助您在后台检索数据。
我用AsyncTasks频繁,但我怎么落实到一个listadapter?我正在尝试创建一个列表,在完成加载时显示一个视图。使用asynctask设置listadapter将在后台加载整个列表,然后显示信息。我正在寻找一次加载一个列表项并将其显示在列表中的实现。 – 2011-05-11 17:13:53
最简单的就是使用的AsyncTask做加载并调用publishProgress
为每个项目被加载(或者,如果要加载的所有项目,并让它们出现一次全部,更新UI中onPostExecute
.notifyDataSetChanged()可能是你在做什么之后?每次向列表中添加一个支持ArrayAdapter的新项目时,都可以在该适配器实例上调用.notifyDataSetChanged()来告诉它刷新。逐渐建立并显示添加到列表中的每个项目。
我到目前为止看到从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();
}
}
}
使用Kotlin和Kotlin扩展库,该任务变得更容易。您可以在名为Anko的库中使用doAsync/uiThread构造,并使用部分代码。在下面的链接教程中,我使用这个库来填充一个ListView,其中股票报价与Kotlin异步调用REST API。科特林完全集成到Android的工作室:
http://www.todroid.com/creating-a-stock-pricing-application-with-kotlin-for-android/
- 1. 无法从异步任务填充列表视图
- 2. 如何填充GridView异步
- 3. 如何用段填充列表视图?
- 4. 填充列表视图
- 5. 异步列表视图
- 6. DataAdapter填充异步异常
- 7. 如何根据2个布尔表列填充列表视图?
- 8. 从JSON填充列表视图
- 9. 使用光标填充列表视图
- 10. 列表视图onPostExecute后未填充
- 11. 值不填充在列表视图
- 12. 填充的ListView,空列表视图
- 13. 使用arrayadapter填充列表视图
- 14. 从组合框填充列表视图
- 15. 使用Knockoutjs填充JqueryMobile列表视图
- 16. SQLite和填充列表视图,android
- 17. 使用mvvm填充列表视图
- 18. 动态填充列表视图
- 19. 从数据库填充列表视图
- 20. 在下方填充列表视图
- 21. 列表视图填充问题
- 22. 异步填充C#数据表
- 23. 如何复制视图以填充列表和表格?
- 24. GWT - 异步填充网格
- 25. 异步填充react-select
- 26. 如何填充表视图,而不是表视图控制器?
- 27. 如何等待,直到阵列填充(异步)
- 28. 如何在json中填充的列表视图之间添加图像视图?
- 29. 如何从pouchdb数据填充jquery移动列表视图
- 30. 如何填充列表视图形式火力
谢谢!当我明天回去工作时,会尝试这个:)没有想过这样做 – 2011-05-11 17:31:08
嗨,什么样的适配器可以清除或添加项目? – Hamidreza 2014-08-11 12:19:56