Android-asynctask,用于填充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

基本上,流程如下所示:当创建片段时(或当用户滑动以刷新布局时),执行异步任务。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);
}
@覆盖
受保护的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);
}