【发布时间】:2015-03-26 02:43:33
【问题描述】:
流程基本上是这样的:当一个片段被创建时(或者当用户滑动刷新布局时),一个 AsyncTask 被执行。 ASyncTask 从 URL 检索信息并设置适配器,然后将其分配给 ListView。
这是片段的代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.tasks_page, container, false);
mSwipeRefreshLayout = (SwipeRefreshLayout)
rootView.findViewById(R.id.list_container);
mSwipeRefreshLayout.setOnRefreshListener(this);
mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light, android.R.color.holo_red_light);
lv = (ListView) rootView.findViewById(android.R.id.list);
getTasks();
return rootView;
}
private void getTasks() {
new TasksRetriever(mSwipeRefreshLayout,tasksAdapter,lv).execute();
}
@Override
public void onRefresh() {
mSwipeRefreshLayout.setRefreshing(true);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getTasks();
}
}, 1000);
}
TaskRetriever 构造函数是:
public TasksRetriever(SwipeRefreshLayout srl, TasksAdapter ta, ListView lv) {
adpt = ta;
this.srl = srl;
this.lv = lv;
}
而 postExecute 是:
@Override
protected void onPostExecute(List<TasksItem> result) {
super.onPostExecute(result);
dialog.dismiss();
if (adpt == null) adpt = new TasksAdapter(result);
else adpt.setItemList(result);
lv.setAdapter(adpt);
adpt.notifyDataSetChanged();
srl.setRefreshing(false);
}
尚不确定它是否有效,但我想知道我是否走在正确的轨道上,因为它对我来说看起来并不干净。另一方面,在我真正拥有数据之前,我无法创建适配器并将其分配给 ListView……这是考虑好还是我做错了?
【问题讨论】:
-
您可以创建一个空适配器并稍后填充它 - 在 AsyncTask 中
-
你在正确的轨道上。如果您总是向适配器加载一个新列表(而不是添加 itens),则可以创建一个新适配器并将其设置为列表视图(顺便说一下,您可以通过 listView.getAdapter() 获取适配器)。我还建议您在 TasksRetriever 中添加一个 progressDialog,因为如果用户在加载列表时触摸或操作设备,可能会导致 ui 冻结或出现不良行为。
-
适配器是公共类 TasksAdapter extends ArrayAdapter
所以我做了 super(Utils.context,android.R.layout.simple_list_item_1, itemList); itemList 包含列表 - 我可以传递 null 吗?或者也许我不需要超级? -
因此将所有 3 个对象(布局、适配器、列表视图)传递给 asynctask,是正确的方法,我只需要按照此处的建议重新组织代码?
标签: android android-listview android-asynctask android-adapter swiperefreshlayout