【问题标题】:How to modify ArrayAdapter' s data from AsyncTask' s postExecute method如何从 AsyncTask 的 postExecute 方法修改 ArrayAdapter 的数据
【发布时间】:2015-02-18 16:24:27
【问题描述】:

我有一个片段,在 onCreateView 我有一个适配器和一个列表视图:

mAdapter = new ArrayAdapter<String>(getActivity(),
            R.layout.list_item,
            R.id.list_item_textview,
            new ArrayList<String>());

    View rootView = inflater.inflate(R.layout.fragment_main, container, false);

    ListView listView = (ListView) rootView.findViewById(R.id.listeview);
    listView.setAdapter(mAdapter)

我还有一个单独的 AsyncTask 类,我想在它的 onPostExecute 方法上向 mAdapter 添加项目:

@Override
protected void onPostExecute(String[] result) {
    if(result !=null){
        mAdapter.clear();
        for(String mString: result){
            mAdapter.add(mString);                
        }

我在 Fragment 的 onStart 方法中执行 AsyncTask :

@Override
public void onStart() {
    super.onStart();
    FetchData fetchData = new FetchData();
    fetchData.execute(location);
}

如何在 AsyncTask 类上使用 Fragment 的 mAdapter 更新其数据,然后通知 listView?

【问题讨论】:

  • 你是 AsyncTask 类,你的 Fragment 类的内部类吗?如果是,您可以只使用 mAdapter。如果没有,那么您可能需要实现一个带有回调的接口。使用 mAdapter.notifyDataSetChanged()
  • 不,它在一个单独的类中
  • @dancer_69,你看到我链接到的 SO 问题了吗?另外考虑到这个任务是特定于单个 API 调用的,而且你对 android 很陌生,你可以使用 AsyncTask 作为嵌套类。

标签: java android listview android-asynctask


【解决方案1】:

如果您的 AsyncTask 类未定义为内部类,那么我建议您创建一个带有回调的接口。举个例子吧。

public interface Updatable { 
    public void onDataUpdate(List<String> data);
}

稍后,您必须在片段中实现该接口,并在 AsyncTask 类中创建一个 setUpdatableListener 方法。所以在某种程度上,你首先创建你的 AsyncTask 实例,然后调用 setUpdatableListener 传递监听器,然后调用 execute.Later 在 postExecute 方法上你必须这样做:

mListener.onDataUpdate(result);

当然,稍后片段中的侦听器将负责更新 mAdapter 数据和 ListView。

请检查这个问题:

How to Define Callbacks in Android?

有关如何使用接口和回调的快速简单说明。

【讨论】:

  • 我根本没用过接口,也不明白怎么把它和我的代码联系起来。你能用我提供的代码给出一个更详细的例子吗?谢谢
【解决方案2】:

基于 API:

ArrayAdapter.addAll() 将把你在异步任务中获得的所有数据添加进去 ArrayAdapter.notifyDataSetChanged() 将通知数组适配器数据已更改 您还可以将 ArrayAdapter.setNotifyOnChange(boolean notifyOnChange) 设置为 true,以便适配器收到更改通知。

如果您想更明确地修改数据集,您可以查看

也许如果您想在添加新数据之前清空数据集,还有: -clear()

每次更改数据后不要忘记致电notifyDatasetChanged()。 总结这段代码应该实现你正在尝试的任何东西。

arrayAdapter.addAll(data);
arrayAdapter.notifyDatasetChanged();

PS:我从documentation中挑选了所有这些

编辑:既然你提到了修改,这是为了完整起见:

您也可以使用ArrayAdapter.getItem (int position)修改单个项目,修改数据并调用notifyDataSetChanged(),

或者如果你想替换一个项目,ArrayAdapter.remove(T) 删除对象并使用ArrayAdapter.insert (T object, int index)重新插入

到这里,CRUD 就完成了!

EDIT2:既然你提到了单独的类,你可以使用一个异步监听器,就像提到的here

【讨论】:

    【解决方案3】:

    使您的ListView listView 成为该类的成员,并在您的onPostExecute 方法上使用listView.setAdapter(mAdapter)

    当您绑定新适配器时,您的 ListView 会自动刷新数据。

    【讨论】:

    • 如果 asynctask 是不同的非内部类,你如何获得适配器?
    • 在创建异步任务时将适配器作为参数传递
    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多