我有一个下载数据的应用程序,这些数据必须显示在 viewpager
的 fragment 中。我不知道如何在执行数据下载的 AsyncTask
中调用 ListFragment
adaptername.notifyDataSetChanged()
。
例如假设我正在下载 future 7 天的温度预报:
我的应用具有以下结构:
MainActivity
:启动AsyncTask
以在onCreate()
中下载数据,并为用户提供选择(按钮
) 看哪一天的。单击该按钮会启动SecondActivity
并将日期索引传递给ViewPager
(以设置当前 View )。
SecondActivity
:包含一个ViewPager
,其中包含7个相同的ListFragments
(列表显示5个时间段内的温度小时,所以列表有 5 个条目)。MyListFragment
:加载时,它会设置adapter
显示每个温度(如果数据已下载),否则它会将温度设置为"正在加载...”
现在我的问题是,如果用户在 MainActivity
上等待直到数据下载完毕,然后他们可以继续到 ViewPager
以查看 ListFragment
温度没有问题。 但如果他们尝试点击一天并加载 ViewPager
在下载完成之前 fragment 将永远只说 “正在加载... "
我需要一种方法,可以从 MainActivity 中
。为此,尽管我需要能够实际访问 AsyncTask
的 onPostExecute()
重新加载 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/