android - 如何在 ViewPager 中访问 ListFragment Adapter

标签 android android-fragments android-asynctask android-viewpager

我有一个下载数据的应用程序,这些数据必须显示在 viewpager 的 fragment 中。我不知道如何在执行数据下载的 AsyncTask 中调用 ListFragment adaptername.notifyDataSetChanged()

例如假设我正在下载 future 7 天的温度预报:

我的应用具有以下结构:

  • MainActivity:启动 AsyncTask 以在 onCreate() 中下载数据,并为用户提供选择(按钮) 看哪一天的。单击该按钮会启动 SecondActivity 并将日期索引传递给 ViewPager(以设置当前 View )。

MainActivity User Selection

  • SecondActivity:包含一个ViewPager,其中包含7个相同的ListFragments(列表显示5个时间段内的温度小时,所以列表有 5 个条目)。

  • MyListFragment:加载时,它会设置 adapter 显示每个温度(如果数据已下载),否则它会将温度设置为 "正在加载...”

现在我的问题是,如果用户在 MainActivity 上等待直到数据下载完毕,然后他们可以继续到 ViewPager 以查看 ListFragment 温度没有问题。 但如果他们尝试点击一天并加载 ViewPager 在下载完成之前 fragment 将永远只说 “正在加载... "

我需要一种方法,可以从 MainActivity 中 AsyncTaskonPostExecute() 重新加载 ListFragment 中的适配器。为此,尽管我需要能够实际访问 ViewPager 正在显示的 ListFragment。如何更新适配器 onPostExecute()


主要 Activity :

protected void onCreate(Bundle savedInstanceState) {
    ...
    new LoadData().execute();
}

protected class LoadData extends AsyncTask<String, Void, String> {
    protected String doInBackground(String... params) {
        //Download happens here
    }
    protected void onPostExecute(String result) {
        //I need to tell the viewpager in SecondActivity to reload the ListFragment it is currently showing here
    }
}

第二个 Activity

private ViewPager mPager;
private PagerAdapter mPagerAdapter;
private int[] temperatureArray;
public void onCreate(Bundle savedInstanceState) {
    ...
    Intent intent = getIntent();
    int[] defaultTemps = {0, 0, 0, 0, 0};
    temperatureArray = getIntArrayExtra("temps", defaultTemps);
    mPager = (ViewPager) findViewById(R.id.pagerID);
    mPager.setCurrentItem(intent.getIntExtra("page", 0));
    mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());
    mPager.setAdapter(mPagerAdapter);
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    ...
    public Fragment getItem(int position) {
        MyListFragment lf = new MyListFragment();
        lf.setTemperatures(temperatureArray);
        return lf;
    }
}

当我在 AsyncTask 中完成下载时,我需要一种能够刷新当前显示 fragment 的方法。

最佳答案

我可以建议做以下两件事之一,不确定这些是否是最佳做法。

您可以让 AsyncTask 在完成信息加载后发送带有独特操作的广播。那当然必须从 OnPostExecute 完成:

@Override
protected void onPostExecute(Void result) {     
        super.onPostExecute(result);
        if (result != null) {
            //_Do whatever action you normally do, like storing result to database.
            //fire up the broadcast
            Intent intent = new Intent(Home.ACTION_FEED_LOADING_FINISHED);
            mContext.sendBroadcast(intent);
        }
}

然后通过 Fragment 代码上的 BroadcastReceiver 拦截它。

private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(ACTION_FEED_LOADING_FINISHED)) {
            //The AsyncTask Finished loading data
        }
    }
};

收到事件后,由于 BroadcastReceiver 位于加载 View 的 fragment 中,因此您可以相应地刷新 UI。

或者,

您可以将要刷新的 View 作为参数传递给 AsyncTask。

像这样想象您的 AsyncTask 类:

private static class getInternetStuffTask extends AsyncTask<String, Void, Void> {

然后你可以创建一个自定义构造函数来接收 View 作为参数:

public getInternetStuffTask (final Context context, final ListView list) {
        this.mContext = context;
        this.mListView= list;           
    }

然后,在 onPostExecute 期间,当数据加载时,您可以直接从 AsyncTask 将适配器设置为 ListView。

关于android - 如何在 ViewPager 中访问 ListFragment Adapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18576128/

相关文章:

java - 可以在Java文件中创建自定义折叠区域吗?

java - 错误: Selected item of spinner is not coverting to string

java - onClick 在 fragment 中不起作用。 (使用imageview作为按钮)

Android 已弃用 Tasks.call - 替换

android - 与 Android 中的 AsyncTask 通信?

java - 如何在android中 Intent 共享图像位图?

java - 检测点击按钮的位置

android - 当我使用其他 fragment 时,viewpager 在 Lollipop 5.0 中无法正常工作

android - 如何在单个 View 中实现两个 fragment ?

Android Asynctask 处理实时视频帧