动态更改 ViewPager 中的片段内容
Dynamically changing fragment contents in a ViewPager
我有:
ViewPager
和 FragmentPagerAdapter
开启(或 FragmentStatePagerAdapter
,并不能真正解决我的问题)。
- 固定数量的片段。它们都共享相同的布局,但有
TextView
需要不同地设置;
- 查询我的数据库并检索要设置到 TextView 中的内容的
AsyncTask
。
所以我的代码是:
public class StatsPagerAdapter extends FragmentPagerAdapter {
static final int FRAGMENT_COUNT = 5;
private Parameters[] sectionData;
public StatsPagerAdapter(FragmentManager manager) {
super(manager);
this.sectionData = new Parameters[FRAGMENT_COUNT];
}
@Override
public Fragment getItem(int position) {
return StatsSectionFragment.getInstance(this.sectionData[position]);
}
@Override
public int getCount() {
return FRAGMENT_COUNT;
}
public void setSectionData(int position, Parameters sectionData) {
this.sectionData[position] = sectionData;
notifyDataSetChanged();
}
}
所以我将 sectionData[position]
传递给通用子片段的 getInstance()
方法。该数据应该区分加载到 ViewPager
.
中的片段的每个实例
起初我将传递一个空引用,但随后在我的异步 class:
@Override
protected void onProgressUpdate(Parameters... sectionValues) {
super.onProgressUpdate(sectionValues);
mPagerAdapter.setSectionData(sectionId, sectionValues[0]);
}
应该调用上面的 setSectionData()
,更新 sectionData[position]
并生成对 notifiyDataSetChanged()
的调用。我希望这样做会使适配器再次检索其所有项目,从而再次调用 getItem()
并加载新片段。
遗憾的是它没有。所以现在:
如果在我的异步任务结果发布之前创建了片段(即 getItem()
),该项目将保持为空(即可见片段,但文本视图为空,因为我从不称为 getInstance(non-null stuff)
。
片段 0 && 片段 1 会发生这种情况。
如果片段是在我的异步任务结束后创建的(片段 2 结束,因为 getItem()
仅在您通过滑动到达该片段时被调用),那么第一个也是唯一一个调用getItem()
生成 getInstance(non-null stuff)
,没关系。
如何将内容重新加载到那些已经存在的片段中,或强制适配器调用 getItem()
并更新其视图?
将此添加到您的适配器:
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}
这会使您的适配器在您调用 notifyDataSetChanged();
时再次调用 getItem
我有:
ViewPager
和FragmentPagerAdapter
开启(或FragmentStatePagerAdapter
,并不能真正解决我的问题)。- 固定数量的片段。它们都共享相同的布局,但有
TextView
需要不同地设置; - 查询我的数据库并检索要设置到 TextView 中的内容的
AsyncTask
。
所以我的代码是:
public class StatsPagerAdapter extends FragmentPagerAdapter {
static final int FRAGMENT_COUNT = 5;
private Parameters[] sectionData;
public StatsPagerAdapter(FragmentManager manager) {
super(manager);
this.sectionData = new Parameters[FRAGMENT_COUNT];
}
@Override
public Fragment getItem(int position) {
return StatsSectionFragment.getInstance(this.sectionData[position]);
}
@Override
public int getCount() {
return FRAGMENT_COUNT;
}
public void setSectionData(int position, Parameters sectionData) {
this.sectionData[position] = sectionData;
notifyDataSetChanged();
}
}
所以我将 sectionData[position]
传递给通用子片段的 getInstance()
方法。该数据应该区分加载到 ViewPager
.
起初我将传递一个空引用,但随后在我的异步 class:
@Override
protected void onProgressUpdate(Parameters... sectionValues) {
super.onProgressUpdate(sectionValues);
mPagerAdapter.setSectionData(sectionId, sectionValues[0]);
}
应该调用上面的 setSectionData()
,更新 sectionData[position]
并生成对 notifiyDataSetChanged()
的调用。我希望这样做会使适配器再次检索其所有项目,从而再次调用 getItem()
并加载新片段。
遗憾的是它没有。所以现在:
如果在我的异步任务结果发布之前创建了片段(即
getItem()
),该项目将保持为空(即可见片段,但文本视图为空,因为我从不称为getInstance(non-null stuff)
。 片段 0 && 片段 1 会发生这种情况。如果片段是在我的异步任务结束后创建的(片段 2 结束,因为
getItem()
仅在您通过滑动到达该片段时被调用),那么第一个也是唯一一个调用getItem()
生成getInstance(non-null stuff)
,没关系。
如何将内容重新加载到那些已经存在的片段中,或强制适配器调用 getItem()
并更新其视图?
将此添加到您的适配器:
@Override
public int getItemPosition(Object object){
return PagerAdapter.POSITION_NONE;
}
这会使您的适配器在您调用 notifyDataSetChanged();
getItem