Android - 为 ListView 填充适配器的异步任务

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

基本上流程如下:创建 fragment 时(或当用户滑动刷新布局时),执行 AsyncTask。 ASyncTask 从 URL 中检索信息并设置适配器,然后将其分配给 ListView。

这是 fragment 的代码:

@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,直到我真正拥有它的数据...这是考虑好还是我做错了?

最佳答案

我会在 ListView 下的 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() 中

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

还要确保您考虑了在 getView() 方法中传递到适配器的空值。

希望这对您有所帮助。

关于Android - 为 ListView 填充适配器的异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28171256/

相关文章:

android - CursorAdapter如何回收ListView中的View?

Android:ListView 上的 AutoCompleteTextView 上边距

android - 如何在 Android 应用程序中创建进度对话框?

java - 无法使用 Google 移动视觉 API 检测数据矩阵格式

android - 升级期间重命名 Android Market 中的应用程序

android - 如何保存图像分类模型并将其用于 android

android - 使用 Retrofit 填充阵列适配器

点击按钮时的 Android Loader vs AsyncTask

android - 没有 super() 调用的 AsyncTask 构造函数

Android:是否有相当于 XML android:digits 的方法?