ViewPager 不显示正确的页面
ViewPager does not show correct page
我有一个 viewPager 并在其中添加片段。
起初我有 4 个片段,显示最后一个。 5, 6, 7 ,8
当我到达第一个片段时。我进行了 Api 调用,获取另外 4 个早期片段的数据:1,2, 3, 4。我将最后一个设置为可见。
我的问题是通过它们。我得到这个:8、7、6、5、8、7、6、5。
如果我退出并重新进入片段,它工作正常。但总是第一次,它似乎以某种方式缓存了其他片段?
这就是我创建片段的方式:
private List<PSActivityFragment> getFragments(){
UserRecord profile = UserRecord.getMyUser(PSProfileActivity.this);
CrudStateCallback crudStateCallback = new CrudStateCallback() {
@Override
public void onResponse(String string) {
}
};
List<PSActivityFragment> fList = new ArrayList<PSActivityFragment>();
if(profile != null) {
loader.setVisibility(View.GONE);
if(profile.getMonths().size() > 0) {
for (PSUserActivityMonth month : profile.getMonths()){
Log.i("","month is fragments created are:" + month);
PSActivityFragment psaf1 = new PSActivityFragment();
psaf1.init(month, crudStateCallback);
fList.add(psaf1);
}
}
}else{
loader.setVisibility(View.VISIBLE);
}
return fList;
}
每次我得到新的数据。我重新创建适配器:
pager.removeAllViews();
pager = null;
pager = (ViewPager) findViewById(R.id.viewpager);
final List<PSActivityFragment> fragments = getFragments();
myPagerAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);
pager.setAdapter(myPagerAdapter);
我尝试重新创建和设置适配器,而不是再次将片段设置到适配器,然后调用 notifyDataSetChanged。但是,我仍然遇到同样的问题。片段是否缓存在某处?为什么会这样?
我检查了日志,片段是按正常顺序创建的:
06-02 14:16:21.514: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=11, year=2015, weeks=1}
06-02 14:16:21.515: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=12, year=2015, weeks=5}
06-02 14:16:21.515: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=1, year=2016, weeks=5}
06-02 14:16:21.515: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=2, year=2016, weeks=5}
06-02 14:16:21.515: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=3, year=2016, weeks=5}
06-02 14:16:21.516: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=4, year=2016, weeks=5}
06-02 14:16:21.516: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=5, year=2016, weeks=6}
06-02 14:16:21.516: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=6, year=2016, weeks=1}
这些是几个月:我应该在循环浏览寻呼机后看到:
6月16日、5月16日、4月16日、3月16日(首先),然后是2月16日、1月16日、12月15日、11月15日。
相反,我看到:6 月 16 日、5 月 16 日、4 月 16 日、3 月 16 日(首先),然后是 6 月 16 日、5 月 16 日、4 月 16 日、3 月 16 日
适配器代码:
public class MyPageAdapter extends FragmentPagerAdapter {
private List<PSActivityFragment> fragments;
public MyPageAdapter(FragmentManager fm, List<PSActivityFragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
PS:我的 activity 扩展了 fragmentActivity,我可能会使用 getSupportFragmentManager,正如您在创建适配器时看到的那样。这可能是问题所在吗?
将 Activity 与 FragmentActivity 和 getSupportFragmentManager 结合使用。我认为这可能是问题所在,所以我这样做了:
if(getSupportFragmentManager() != null && getSupportFragmentManager().getFragments() != null){
getSupportFragmentManager().getFragments().clear();
}
现在可以使用了!!!
我有一个 viewPager 并在其中添加片段。 起初我有 4 个片段,显示最后一个。 5, 6, 7 ,8 当我到达第一个片段时。我进行了 Api 调用,获取另外 4 个早期片段的数据:1,2, 3, 4。我将最后一个设置为可见。 我的问题是通过它们。我得到这个:8、7、6、5、8、7、6、5。 如果我退出并重新进入片段,它工作正常。但总是第一次,它似乎以某种方式缓存了其他片段?
这就是我创建片段的方式:
private List<PSActivityFragment> getFragments(){
UserRecord profile = UserRecord.getMyUser(PSProfileActivity.this);
CrudStateCallback crudStateCallback = new CrudStateCallback() {
@Override
public void onResponse(String string) {
}
};
List<PSActivityFragment> fList = new ArrayList<PSActivityFragment>();
if(profile != null) {
loader.setVisibility(View.GONE);
if(profile.getMonths().size() > 0) {
for (PSUserActivityMonth month : profile.getMonths()){
Log.i("","month is fragments created are:" + month);
PSActivityFragment psaf1 = new PSActivityFragment();
psaf1.init(month, crudStateCallback);
fList.add(psaf1);
}
}
}else{
loader.setVisibility(View.VISIBLE);
}
return fList;
}
每次我得到新的数据。我重新创建适配器:
pager.removeAllViews();
pager = null;
pager = (ViewPager) findViewById(R.id.viewpager);
final List<PSActivityFragment> fragments = getFragments();
myPagerAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);
pager.setAdapter(myPagerAdapter);
我尝试重新创建和设置适配器,而不是再次将片段设置到适配器,然后调用 notifyDataSetChanged。但是,我仍然遇到同样的问题。片段是否缓存在某处?为什么会这样? 我检查了日志,片段是按正常顺序创建的:
06-02 14:16:21.514: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=11, year=2015, weeks=1}
06-02 14:16:21.515: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=12, year=2015, weeks=5}
06-02 14:16:21.515: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=1, year=2016, weeks=5}
06-02 14:16:21.515: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=2, year=2016, weeks=5}
06-02 14:16:21.515: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=3, year=2016, weeks=5}
06-02 14:16:21.516: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=4, year=2016, weeks=5}
06-02 14:16:21.516: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=5, year=2016, weeks=6}
06-02 14:16:21.516: I/(14192): month is fragments created are:PSUserActivityMonth{category='u/23', month=6, year=2016, weeks=1}
这些是几个月:我应该在循环浏览寻呼机后看到: 6月16日、5月16日、4月16日、3月16日(首先),然后是2月16日、1月16日、12月15日、11月15日。 相反,我看到:6 月 16 日、5 月 16 日、4 月 16 日、3 月 16 日(首先),然后是 6 月 16 日、5 月 16 日、4 月 16 日、3 月 16 日
适配器代码:
public class MyPageAdapter extends FragmentPagerAdapter {
private List<PSActivityFragment> fragments;
public MyPageAdapter(FragmentManager fm, List<PSActivityFragment> fragments) {
super(fm);
this.fragments = fragments;
}
@Override
public Fragment getItem(int position) {
return this.fragments.get(position);
}
@Override
public int getCount() {
return this.fragments.size();
}
}
PS:我的 activity 扩展了 fragmentActivity,我可能会使用 getSupportFragmentManager,正如您在创建适配器时看到的那样。这可能是问题所在吗?
将 Activity 与 FragmentActivity 和 getSupportFragmentManager 结合使用。我认为这可能是问题所在,所以我这样做了:
if(getSupportFragmentManager() != null && getSupportFragmentManager().getFragments() != null){
getSupportFragmentManager().getFragments().clear();
}
现在可以使用了!!!