巧力避免ViewPager的预加载数据,Tablayout+Fragment+viewPager



问题描述

最近在进行一个项目的开发,其中使用到了Tablayout+Fragment+viewPager来搭建一个基本的框架,从而出现了设置数据适配器的时候,item的位置错乱问题。我打印log日志的时候发现原来是,设置了两次数据数据适配器,考虑到ViewPager的预加载数据问题,我就想到了问题出现了在这里。当我加载第一个tablayout的tab的时候,第二个tab的数据已经初始化完毕了,从而导致了数据适配器设置了两次的问题,也就出现了数据错乱的问题。

解决方案

我使用了下面的方法就解决了问题。

在ViewPager初始化的时候对ViewPager进行监听事件


   //设置监听事件
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                //选中
               // 当该页面选中时,才开始初始化当前页面的数据
  mFragmentsLists.get(position).initData(); } @Override public void onPageScrollStateChanged(int state) { } });

//默认初始化第一页的数据
mFragmentsLists.get(0).initData();

上面的代码片中,viewPager就是初始化的viewpager的控件,mFragmentsLists就是我们要显示的中部的Fragment集合
对Viewpager设置了监听事件,当那一页被选中就初始化哪一页的数据,从而避免了ViewPager预加载数据问题。
Fragment中的代码片段:
  // Fragment填充布局
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       //在这里初始化Fragment的布局
                 //但是不要初始化数据,不要在Fragment创建的时候调用initData()方法,等着外界数据调用
        return view;
    }
Fragment中的initData()方法:
    /**
     * 初始化数据
     */
    public void initData() {
        //所有初始化数据的操作都在这里进行
    }

我这样就解决了我的问题。




原文地址:https://www.cnblogs.com/shaofeer/p/11154441.html