在 onCreate() 中,我调用了一个类 ChannelStore 来创建一个单例,而我的 fragment 的 ListView 正在使用由 channelstore 创建的数据集。一旦 doInBackground() 完成,我需要在适配器上调用 notifyDateSetChanged() 但我不确定如何实现,因为我的 AsyncTask 在一个类 (ChannelStore) 中,而适配器在我的 fragment (ChannelListFragment) 中。有人可以引导我解决问题吗?
channel 列表 fragment :
public class ChannelListFragment extends ListFragment {
private static final String TAG = "ChannelListFragment";
public ArrayList<Channel> mChannels;
public ChannelAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActivity().setTitle(R.string.channels_title);
setHasOptionsMenu(true);
try {
mChannels = ChannelStore.get(getActivity()).getChannels();
} catch (XmlPullParserException | IOException | InterruptedException
| ExecutionException | TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
adapter = new ChannelAdapter(mChannels);
setListAdapter(adapter);
}
...
public class ChannelAdapter extends ArrayAdapter<Channel> {
public ChannelAdapter(ArrayList<Channel> channels) {
super(getActivity(), 0, channels);
}
ChannelStore 中的 AsyncTask:
private class ChannelSetup extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
try {
// download xml feed
}
@Override
protected void onPostExecute(String result) {
try {
// parse xml feed
....
Log.i(TAG, "Adding programmes to channels...");
addProgrammes(mProgrammes);
Log.i(TAG, "Programmes per channel: "
+ listChannelsProgrammes(mChannels));
// need to update listview adapter somehow
}
最佳答案
如果在 onPostExecute 中您可以访问由 channelstore 和适配器创建的数据集,则可以通过调用 notifyDateSetChanged() 更改数据集并更新适配器。另一种方法是使用
runOnUiThread(new Runnable() {
public void run() {
// your code to update adapter.
}
});
在您需要访问 ui 线程以更新某些内容的每个地方。
您的 onPostExecute 始终在 UI 线程上运行,因此您可以访问 fragment 适配器。为了做到这一点,你可以使用
getFragmentManager().getFragmentByTag('your fragment tag').ChannelAdapter.notifyDataSetChanged()
关于android - 如何从另一个类中的 AsyncTask onPostExecute() 调用 notifyDataSetChanged(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25098810/