如何从 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?
有关如何使用接口和回调的快速简单说明。
我有一个片段,在 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?
有关如何使用接口和回调的快速简单说明。