如何让ViewPager+Fragment来回切换时数据不重复加载
答案:1 悬赏:30 手机版
解决时间 2021-03-02 07:40
- 提问者网友:欺烟
- 2021-03-02 03:17
如何让ViewPager+Fragment来回切换时数据不重复加载
最佳答案
- 五星知识达人网友:拾荒鲤
- 2021-03-02 04:38
提供一个方案,通过动态管理ViewPager的缓存个数来解决即可。。
@Override
public void onPageSelected(int position) {
Fragment fragment = fragments[position];
//判断是否滑动到了第二个界面,假如是那么加载4个界面,前后各两个,随着postion递增
if(position>=2){
viewpager.setOffscreenPageLimit(position);
}
}
}
但是这样的操作有很大的BUG,当postion=2时,ViewPager会首先移除原先0位置的Fragment,再从新添加,并且也没有解决缓存过多问题。于是,在经过失败后我想出了第二个方案,可不可以自己写一个FragmentViewPager对Fragment进行管理呢,让FragmentViewPager不执行移除原先的Fragment。
MyFragmentViewPager
public class MyFragmentPagerAdapter extends PagerAdapter {
private Fragment[] fragments;
private FragmentManager manager;
public MyFragmentPagerAdapter(FragmentManager fm, Fragment[] fragments) {
super();
manager=fm;
this.fragments = fragments;
}
@Override
public int getCount() {
return fragments.length;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = fragments[position];
//判断当前的fragment是否已经被添加进入Fragmentanager管理器中
if (!fragment.isAdded()) {
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(fragment, fragment.getClass().getSimpleName());
//不保存系统参数,自己控制加载的参数
transaction.commitAllowingStateLoss();
//手动调用,立刻加载Fragment片段
manager.executePendingTransactions();
}
if (fragment.getView().getParent() == null) {
//添加布局
container.addView(fragment.getView());
}
return fragment.getView();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//移除布局
container.removeView(fragments[position].getView());
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
@Override
public void onPageSelected(int position) {
Fragment fragment = fragments[position];
//判断是否滑动到了第二个界面,假如是那么加载4个界面,前后各两个,随着postion递增
if(position>=2){
viewpager.setOffscreenPageLimit(position);
}
}
}
但是这样的操作有很大的BUG,当postion=2时,ViewPager会首先移除原先0位置的Fragment,再从新添加,并且也没有解决缓存过多问题。于是,在经过失败后我想出了第二个方案,可不可以自己写一个FragmentViewPager对Fragment进行管理呢,让FragmentViewPager不执行移除原先的Fragment。
MyFragmentViewPager
public class MyFragmentPagerAdapter extends PagerAdapter {
private Fragment[] fragments;
private FragmentManager manager;
public MyFragmentPagerAdapter(FragmentManager fm, Fragment[] fragments) {
super();
manager=fm;
this.fragments = fragments;
}
@Override
public int getCount() {
return fragments.length;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = fragments[position];
//判断当前的fragment是否已经被添加进入Fragmentanager管理器中
if (!fragment.isAdded()) {
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(fragment, fragment.getClass().getSimpleName());
//不保存系统参数,自己控制加载的参数
transaction.commitAllowingStateLoss();
//手动调用,立刻加载Fragment片段
manager.executePendingTransactions();
}
if (fragment.getView().getParent() == null) {
//添加布局
container.addView(fragment.getView());
}
return fragment.getView();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
//移除布局
container.removeView(fragments[position].getView());
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯