【问题标题】:How to call notifyDataSetChanged() from AsyncTask onPostExecute() in another class如何在另一个类中从 AsyncTask onPostExecute() 调用 notifyDataSetChanged()
【发布时间】:2014-08-02 19:52:45
【问题描述】:

在 onCreate() 中,我正在调用 ChannelStore 类来创建单例,并且我的片段的列表视图正在使用由 channelstore 创建的数据集。一旦 doInBackground() 完成,我需要在适配器上调用 notifyDateSetChanged(),但我不确定如何实现这一点,因为我的 AsyncTask 在一个类(ChannelStore)中,而适配器在我的片段(ChannelListFragment)中。有人可以引导我找到解决方案吗?

ChannelListFragment:

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

    }

【问题讨论】:

    标签: android android-asynctask android-arrayadapter


    【解决方案1】:

    如果在 onPostExecute 中可以访问由 channelstore 和适配器创建的数据集,则可以通过调用 notifyDateSetChanged() 更改数据集并更新适配器。另一种方法是使用

    runOnUiThread(new Runnable() {
       public void run() {
        // your code to update adapter.
       }
    });
    

    在您需要访问 ui 线程以更新某些内容的每个地方。 您的 onPostExecute 始终在 UI 线程上运行,因此您可以访问片段适配器。为了做到这一点,你可以使用

    getFragmentManager().getFragmentByTag('your fragment tag').ChannelAdapter.notifyDataSetChanged()
    

    【讨论】:

    • 如何确定我的 onPostExecute 是否可以更新我的适配器?并且runOnUiThread在onPostExecute下正确吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多