Android - asynctask,用于填充listview的适配器

时间:2015-01-27 13:05:32

标签: android android-listview android-asynctask android-adapter swiperefreshlayout

基本上,流程如下所示:当创建片段时(或当用户滑动以刷新布局时),执行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,直到我实际拥有它的数据......这是考虑好还是我做错了?

2 个答案:

答案 0 :(得分:2)

我会在列表视图下的onCreate()方法中设置列表适配器,并将其设为实例变量(不是本地变量),以便Async任务可以按如下方式访问它,即

@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()

@Override
protected void onPostExecute(List<TasksItem> result) {
    dialog.dismiss();  
    mAdpt.clear();
    for( TaskItem ti : result ) 
    {
      mAdpt.add( ti );
    }
    mAdpt.notifyDataSetChanged();
    srl.setRefreshing(false);
}

另外,请确保在getView()方法中考虑传递到适配器的空值。

希望这有帮助。

答案 1 :(得分:0)

你可以创建一个空的适配器并在以后填写 - 在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);
}