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

时间:2022-04-26 05:25:52

问题描述

最近在进行一个项目的开发,其中使用到了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() {
//所有初始化数据的操作都在这里进行
}

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