Android日常(10) 刷新FragmentPagerAdapter(在viewpager中getArguments 获取到的Bundle不是新生成Fragment对象的Bundle)
写在前面的话
今天在开发视频详情页面的时候,遇到一个问题。因为这个问题发现ViewPager在刷新的时候因为FragmentPagerAdapter机制导致的不刷新。
下面我讲进行讲解:从出现问题,到发现问题原因和解决问题的办法
问题出现的场景
Activiy上面有个ViewPager去管理三个子Fragment,因为业务原因需要重建并刷新Fragment,其实这种做法多少有些不合理,但是确实能解决问题,省去很多不必要的麻烦,不得不说,谷歌在设计Fragment的时候是花了很多心思的,在优化性能方面下足了功夫。以后我们讲对代码设计进行优化,提高性能!
发现问题原因
这里发现问题我是采用了在关键参数位置打断点,比如设置参数,和fragment的生命周期钩子函数里面对设置参数进行断点查看,发现了在刷新时viewpager虽然重新设置了Adapter,但是adapter里面fragment的生命周期钩子函数里面取到的Bundle还是旧的数据。
解决问题的办法
重写FragmentPagerAdapter的getItemId方法使用对象hashcode代替使用父类super方法
class ContentPagerAdapter extends FragmentPagerAdapter {
public ContentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return mTabFragments.get(position);
}
@Override
public int getCount() {
return mTabTitles.length;
}
@Override
public CharSequence getPageTitle(int position) {
String titleName = getResources().getString(mTabTitles[position]);
return titleName;
}
@Override
public long getItemId(int position) {
//super.getItemId(position);
//重写getItemId方法,把super方法去除换成新对象的hashcode
return mTabFragments.get(position).hashCode();
}
}
结束语
喜欢加个关注支持一下后续会有更多更新内容