我有一个片段,在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?
答案 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会自动刷新数据。