ViewPager + Fragment中对Fragment数据懒加载的实现

ViewPager + Fragment中对Fragment数据懒加载的实现

由于我的底部导航栏是通过ViewPager + Fragment的方式来实现的

这样就有一个问题,那就是ViewPager的预加载问题,一般来说,ViewPager 会预先加载首个Fragment的左边和右边两个fragment,除非左边或者右边没有fragment

这样会造成,如果首先展示的fragment数据量很小,而他旁边的fragment数据量很大,这样就会造成两个一块加载,消耗时间很大,用户体验不好

解决方案:fragment懒加载

我是在数据量大的那个fragment上使用了懒加载,这样就避免了上述那个问题

思路:

只有当 fragment 对用户可见且 fragment 的视图已经加载完成以后,我们才可以做对应的数据加载操作,所以引入两个布尔变量标识

因为是跟 viewPager 相结合,所以在 fragment 中判断对用户是否可见我们重写setUserVisibleHint生命周期方法进行判断

当对用户可见且 view 已经加载完成后,我们在 onResume 方法中做懒加载操作

做完懒加载操作后,记得恢复先前的标识,防止数据重复加载

代码:

public class CommunityFragment extends Fragment {
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_SHOW_TEXT = "text";

    private String mContentText;
    View rootView=null;

    private NestedListView listView;
    private List<List<Image>> imagesList;

    private boolean isVisible = false;// 对用户是否可见标识
    private boolean isViewCreated = false;// view是否已经加载完成标识

    public CommunityFragment() {
        // Required empty public constructor
    }


    public static CommunityFragment newInstance(String param1) {
        CommunityFragment fragment = new CommunityFragment();

        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mContentText = getArguments().getString(ARG_SHOW_TEXT);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        // Inflate the layout for this fragment
//        if (rootView == null && savedInstanceState == null){
//            rootView = inflater.inflate(R.layout.activity_community, container, false);
//            initView(); //初始化控件
//        }
        if (rootView == null && savedInstanceState == null){
            rootView = inflater.inflate(R.layout.activity_community, container, false);
        }

        isViewCreated = true;// view 已经加载

        return rootView;
    }

    @Override
    public void onResume() {
        super.onResume();
        lazyLoad();
    }

    /**
     * 延迟加载 - 对用户可见且view已经加载完成
     */
    private void lazyLoad() {
        if(isVisible && isViewCreated){
            loadData();
            reset();// 恢复标识,防止重复加载
        }
    }

    /**
     * 恢复标记 防止重复加载
     */
    private void reset(){
        isViewCreated = false;
        isVisible = false;
    }

    /**
     * 加载数据操作
     */
    private void loadData() {
        initView();
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser){

            isVisible = true;// 对用户可见
            lazyLoad();

        }else {
            isVisible = false;// 对用户不可见
        }
    }


    public void initView(){
        //在这里加载组件,数据等等

    }


    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu, menu);
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值