前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FragmentPagerAdapter 滑动过后界面不显示的解决方案

FragmentPagerAdapter 滑动过后界面不显示的解决方案

作者头像
夏洛克的猫
发布2018-10-18 14:23:46
1.2K0
发布2018-10-18 14:23:46
举报
文章被收录于专栏:移动开发

最近工作中UI给出如图设计,心想这个结合viewpager,fragment,FragmentPagerAdapter就能构建出来.

这里写图片描述
这里写图片描述

说干就干,写出如下代码(部分代码省略)

代码语言:javascript
复制
 @Override
    public Fragment getItem(int position) {
        AllNewsFragment result = null;
        Bundle bundle = new Bundle();
        switch (position) {
            case 0:
                if (mAllNewsFragment == null) {
                    mAllNewsFragment = new AllNewsFragment();
                }
                result = mAllNewsFragment;
                break;
            case 1:
                if (mLastNewsFragment == null) {
                    mLastNewsFragment = new AllNewsFragment();
                }
                result = mLastNewsFragment;
                break;
            case 2:
                if (mShoppingGuideFragment == null) {
                    mShoppingGuideFragment = new AllNewsFragment();
                }
                result = mShoppingGuideFragment;
                break;
            case 3:
                if (mNewCarNewsFragment == null) {
                    mNewCarNewsFragment = new AllNewsFragment();
                }
                result = mNewCarNewsFragment;
                break;
            case 4:
                if (mEvaluatingFragment == null) {
                    mEvaluatingFragment = new AllNewsFragment();
                }
                result = mEvaluatingFragment;
                break;
            default:
                break;
        }
        return result;
    }

实际效果一跑,懵了,左右来回滑动,界面数据全都没了,一片空白. 立马在getItem代码中打断点,发现左右滑动时压根就没有调用getItem方法. 出乎意料啊,赶紧看下FragmentPagerAdapter 官方文档

Implementation of PagerAdapter that represents each page as a Fragment that is persistently kept in the fragment manager as long as the user can return to the page.

结合其他google结果,大致意为FragmentPagerAdapter中所创建出来的fragment会被fragment manager保存,也即在内存中.

实际运行时,滑动时会直接去内存中寻找.这样问题就可以断定为fragment再次添加到界面时数据丢失了,没有保存下来.这样就好办了,我们在frament中做数据保存处理即可.在fragment中加入类似代码:

代码语言:javascript
复制
  @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //做数据保存处理
    }

  @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
        //做恢复数据处理
    }

心想这下,该没有事了吧.代码一跑,滑动几次后妥妥还是白屏无数据.一怒之下再次 google fragment 的数据恢复和保存处理.果然已有现成的解决方案.在此感谢泡在网上的日子的解决方案,我就不赘述了.

结论:FragmentPagerAdapter和viewpager滑动白屏无数据,是由于恢复内存中的fragment的数据丢失,需要自己做手动数据保存,这样才能避免此情况的出现.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年09月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档