Android-asynctask,用于填充listview的适配器
基本上,流程如下所示:当创建片段时(或当用户滑动以刷新布局时),执行异步任务。ASyncTask从URL检索信息并设置适配器,然后将适配器分配给ListView 这是片段的代码:Android-asynctask,用于填充listview的适配器,android,android-listview,android-asynctask,android-adapter,swiperefreshlayout,Android,Android Listview,Android Asynctask,Android Adapter,Swiperefreshlayout,基本上,流程如下所示:当创建片段时(或当用户滑动以刷新布局时),执行异步任务。ASyncTask从URL检索信息并设置适配器,然后将适配器分配给ListView 这是片段的代码: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View roo
@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);
}
@覆盖
受保护的void onPostExecute(列表结果){
super.onPostExecute(结果);
dialog.dismise();
如果(adpt==null)adpt=new TasksAdapter(结果);
else adpt.setItemList(结果);
低压设置适配器(adpt);
adpt.notifyDataSetChanged();
srl.设置刷新(假);
}
还不确定它是否有效,但我想知道我是否走上了正确的道路,因为我觉得它看起来不干净。另一方面,我无法创建适配器并将其分配给ListView,直到我实际拥有它的数据。。。这是正常的还是我做错了?您可以创建一个空适配器,稍后在AsyncTask中填充它 您的
onPostExecute()
应该如下所示:
@Override
protected void onPostExecute(List<TasksItem> result) {
dialog.dismiss();
if (adpt == null){
adpt = new TasksAdapter(result);
lv.setAdapter(adpt);
}else{
adpt.clear();
}
for( TaskItem ti : result ) adpt.add( ti );
adpt.notifyDataSetChanged();
srl.setRefreshing(false);
}
@覆盖
受保护的void onPostExecute(列表结果){
dialog.dismise();
if(adpt==null){
adpt=新任务适配器(结果);
低压设置适配器(adpt);
}否则{
adpt.clear();
}
对于(任务项ti:结果)adpt.add(ti);
adpt.notifyDataSetChanged();
srl.设置刷新(假);
}
我将在列表视图下的onCreate()方法中设置列表适配器,并将其设置为实例变量(而不是本地变量),以便异步任务可以按如下方式访问它:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
lv = (ListView) rootView.findViewById(android.R.id.list);
mAdpt = new TasksAdapter(null);
lv.setAdapter(mAdpt);
}
然后在onPostExecute()中
@覆盖
受保护的void onPostExecute(列表结果){
dialog.dismise();
mAdpt.clear();
对于(任务项ti:结果)
{
添加(ti)的制造商;
}
mAdpt.notifyDataSetChanged();
srl.设置刷新(假);
}
还要确保在getView()方法中考虑传递到适配器的null值
希望这能有所帮助。您可以创建一个空适配器,稍后再填充它-在AsyncTask中,您的思路是正确的。如果总是向适配器加载新列表(而不是添加iTen),则可以创建新适配器并将其设置为列表视图(通过listView.getAdapter()获取适配器的方式)。我还建议您在TasksRetriever中添加一个progressDialog,因为如果用户在加载列表时触摸或操作设备,可能会导致ui冻结或不必要的行为。适配器是公共类TasksAdapter Extendes ArrayAdapter,所以我做了super(Utils.context,android.R.layout.simple_list_item_1,itemList);itemList包含列表-我可以传递null吗?或者也许我不需要超链接?因此,将所有3个对象(布局、适配器、列表视图)传递给asynctask是正确的方法,我只需要按照这里的建议重新组织代码即可?请注意,
mAdpt.clear
应该是mAdpt.clear()代码>在适配器中,我有一个公共的void setItemList(List itemList){this.itemList=itemList;}-我想使用adpt.clear;adpt.add()是更好的编码还是没有太大区别?@Amos在资源分配上有明显的区别。您应该只创建一次适配器
,并根据需要修改基础数据集。创建新的适配器是一项繁重的工作。因此,我对Andy B的答案投了赞成票。你可以对支持列表做任何你想做的事情:)问题是,在调用notifyDataSetChanged()
之前,更改不会反映在listview
中。唯一可以调用它的地方是onPostExcecute()
谢谢,我想知道我正在编写好的/干净的代码,而不仅仅是一个正常工作的代码(很简单:)
@Override
protected void onPostExecute(List<TasksItem> result) {
dialog.dismiss();
mAdpt.clear();
for( TaskItem ti : result )
{
mAdpt.add( ti );
}
mAdpt.notifyDataSetChanged();
srl.setRefreshing(false);
}