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

时间:2015-02-18 16:24:28

标签: java android listview android-asynctask

我有一个片段,在onCreateView中我有一个适配器和一个listview:

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?

3 个答案:

答案 0 :(得分:1)

基于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

答案 1 :(得分:1)

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

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

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

mListener.onDataUpdate(result);

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

请检查此问题:

How to Define Callbacks in Android?

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

答案 2 :(得分:0)

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

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