我的主片段和Viewpager在这个片段中有3页(1)。在主片段(1)中我选择城市并根据城市主片段的值(1)从服务器加载数据并传入FragmentPagerAdapter。第一次一切都好,但是如果我选择另一个城市(2),只有在将页面从一侧滑动到另一侧之后,viewpager中的数据才会更新。
因此,如果我首先选择另一个sity,我会看到空白页1,在向前滑动到第2页和第3页并返回到第1页后,数据在1页和3页上更新,但是2页是空的。
所以我不知道错误在哪里? 谢谢
这是我的FragmentStatePagerAdapter代码
private class MyPagerAdapter extends FragmentStatePagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getItemPosition(Object object) {
Log.d("getItemPosition","123");
return POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
Resources res = getResources();
String[] title = res.getStringArray(R.array.title_spa_viewpager_array);
return title[position];
}
@Override
public android.support.v4.app.Fragment getItem(int pos) {
switch(pos) {
case 0: return FirstFragment.newInstance(mSpa.getSpaName()+SpaInfoParserObject.MySpaInfo.getSpaInfoText());
case 1: return SecondFragment.newInstance("",SpaInfoParserObject.MySpaInfo);
case 2: return PhotoFragment.newInstance("", SpaInfoParserObject.MySpaInfo.getSpaInfoPic(), mSpa);
default: return FirstFragment.newInstance(mSpa.getSpaPhone());
}
}
@Override
public int getCount() {
return 3;
}
}
答案 0 :(得分:2)
您的代码存在两个主要问题。
首先,我看了你之前的一个问题,我看到你使用了:
FragmentManager f = ((FragmentActivity) getActivity()).getSupportFragmentManager();
初始化ViewPager
的适配器。这是不正确的,如果您在另一个ViewPager
中嵌入Fragment
(及其成为嵌套片段的片段),那么您必须使用FragmentManager
方法返回的getChildFragmentManager()
( Fragment
类)而不是上面的行。如果您已经使用getChildFragmentManager()
,请忽略此部分,否则请更改代码以使用它。
其次,之前已经讨论过更新ViewPager
的片段(尽管你使用嵌套片段的过程相同),你需要考虑两个ViewPager
&#39的案例; s片段可能是:
片段是当前可见片段或可见片段左/右侧最近的片段(例如,如果位置0是当前可见片段,则在内存中有两个片段:位置0和位置1)。这些片段构建了视图并准备好向用户显示,您需要直接更新其数据/视图(例如,通过调用某些setter方法)。访问此片段的最简单方法是使用this question中的代码(这是非常相关的,同时请注意您使用嵌套片段,因此getFragmentManager()
将替换为getChildFragmentManager()
)
除上述之外的任何其他位置。要处理这种情况,您应该使ViewPager
中的每个片段检索onCreateView()
中的数据(这将反映新的数据更改),如果用户向该片段滑动,将会调用这些数据。一些示例代码:
// in the onCreateView()
YourParentFragmentClass parent = (YourParentFragmentClass) getParentFragment();
// parent is the Fragment holding the ViewPager and you can use further use it to
// get data
ViewPager
中的每个片段都应该有这段代码来处理数据更新。例如,如果您滑动到第三个片段然后更新数据,则应直接更新片段2和3.然而,当ViewPager
将重新创建其视图时(当用户从片段3滑动时),片段1将会更新片段2),在那一刻,上面的代码将从父片段中获取最新的数据。
您也不需要将数据作为newInstance()
方法中的参数传递。