如何从 AsyncTask 的 postExecute 方法修改 ArrayAdapter 的数据

How to modify ArrayAdapter' s data from AsyncTask' s postExecute method

我有一个片段,在 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 class,我想在它的 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的mAdapterclass更新其数据然后通知listView?

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

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

基于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) to remove the object and reinsert using ArrayAdapter.insert (T object, int index)

好了,CRUD 就完成了!

EDIT2:由于您提到了单独的 class,您可以使用提到的异步侦听器 here

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

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

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

mListener.onDataUpdate(result);

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

请检查这个问题:

How to Define Callbacks in Android?

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