viewpager + fragmentpageradapter 切换fragment产生的问题

问题描述一:

   在使用viewpager+fragmentpageradapter ,起始fragment为A(页面内容比较多,外层是一个scrollview,里层含有一些控件和一个ListView)  切换到相邻的fragmentB(fragmentB内容只有一个ScrollView+ListView)  然后再切换到A,刚开始发现fragmentA内容是fragmentB的内容,这一问题我很困惑。正如你所知道,切换fragment时,会先从fragmentmanager中找是否已经缓存的fragment,有的话直接取出来而不进行重新生成fragment操作,即便是这样也不应该出现这个错误,只要我fragmentmanager中缓存的fragment是正确的,不应该出现这个问题。

   我在网上搜索了一下,发现基本都是更新问题,不是我要的答案。

   因此我自己换了几个fragment进行测试,发现fragmentA和fragmentC或D相邻就不会产生这个问题,fragmentB和fragmentC或者D相邻也不会产生这个问题。再一次测试FragmentA和FragmentB之间切换,一个不经意,我滑动了一下FragmentA,发现FragmentA中的内容并不是fragmentB的内容,只不过是FragmentA的scrollview没有滑动到顶端。

 

解决办法一:

  我通过将ScrollView中的第一个控件设置焦点(通过设置focusable="true"、focusableintouchmode=“true”),顺利的将FragmentA中的ScrollView移动到顶端。无论怎么切换Fragment,FragmentA中的ScrollView都能顺利移动到顶端(原来是在代码中利用smoothscroto(0,0)方法将scrollview移动到顶端,但是由于viewpager中fragment缓存,导致Fragment不执行生命周期)。

 

问题描述二:

  解决完上一个问题后,问题又来了,从FragmentA切换到FragmentC,再切换回FragmentA,FragmentA中内容重新加载,并且ScrollView移动到顶端。这不满足我的要求,首先FragmentA中内容我不希望重新加载,其次,我之前浏览过FragmentA,切换之后,我希望FragmentA停留在我之前浏览的地方。

 

解决方法二:

   方法一: 我利用 ViewPager pager;   pager.setOffscreenPageLimit(3);  方法缓存更多的Fragment。 pager.setOffscreenPageLimit(3);能缓存4个fragment。这样从fragmentA切换到FragmentC再切换回来就不会重新加载fragmentA。fragmentA中的界面自然而然的停留在我之前浏览地方。

  方法二: 

         做一个fragment    view缓存,

         转至:http://my.oschina.net/u/1424386/blog/341486

 

    private  View rootView;//缓存Fragment view     
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if(rootView==null){
            rootView=inflater.inflate(R.layout.tab_fragment, null);
        }
   //缓存的rootView需要判断是否已经被加过parent, 如果有parent需要从parent删除,要不然会发生这个rootview已经有parent的错  误。         ViewGroup parent = (ViewGroup) rootView.getParent();
        if (parent != null) {
            parent.removeView(rootView);
        
        return rootView;
    }
 
    上面两种方法各有各的好处。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值