ViewPager和TabLayout取消预加载

╮(╯▽╰)╭写了这么多篇Android的文章都没人看,估计也因为自己写的文章都比较皮毛。
其实每一次遇到问题第一时间都是来搜,没有再百度。一直都觉得里的大神写的会比较用心,像RxJava和Picasso都是在找到的文章学会的。
因为这篇文章在还没完善的解决方案,于是我简化的大神的思路,在此献丑了。

最终效果:(即将显示的Fragment是还没加载的,如何实现呢)

ViewPager和TabLayout取消预加载_第1张图片
wuli大网易云

实现思路:

Android中ViewPager和TabLayout组合使用真的是太方便了,一开始因为它预加载附近的页面解决了很久都没实现,差点就不想用它了。不过现在发现,它还是很有爱的。

在ViewPager中有一个方法:
setOffscreenPageLimit(int limit),这是预告加载的页面数量,默认是1,就算设置0了,还是会默认改成1。(这个没关系,这个反而方便了我们,接下来的工作)
假如页面的tab数量是4个,像网易云一样,当4个页面都加载过后,除非下拉更新,否则无论页面间怎么切换数据都不会变。这时候我们就viewpager.setOffscreenPageLimit(4);

1. 让TabFragment页面onCreateView不做任何加载数据操作

既然setOffscreenPageLimit是不能指望取消预加载,那我们就直接放弃它了,同时也让onCreateView不做加载数据操作。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_one, container, false);
    return view;
}
2.在使用ViewPager的页面中声明一些属性,和根据滑动的position加载数据

本文在AlarmFragment中使用了ViewPager和TabLayout

public int totalTabNum = 4;//假如有四个Fragment页面
public int openTabNum = 0;//当前已打开的页面数量

public void setupViewPager(){
    if(fragmentList != null && titleList != null){
        fragmentPagerAdapter = new MyFragmentPagerAdapter(getChildFragmentManager(), fragmentList, titleList);
        viewpager.setAdapter(fragmentPagerAdapter);
        tablayout.setupWithViewPager(viewpager);
        viewpager.setCurrentItem(0);
        viewpager.setOffscreenPageLimit(4);
        viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                //滑动监听加载数据,一次只加载一个标签页
                if(openTabNum < totalTabNum){
                    ((TabFragment)fragmentPagerAdapter.getItem(position)).sendMessage();
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }
}
3. 回到TabFragment中,让Handler加载数据
private AlarmFragment alarmFragment;//这是使用ViewPager的页面

private boolean is_load = false;
private Handler handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        if(!is_load){
            is_load = true;
            if(alarmFragment.openTabNum < alarmFragment.totalTabNum){
                alarmFragment.openTabNum++;
            }
            loadDataList();//加载网络数据的方法
        }
        return ;
    }
};

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_one, container, false);
    this.alarmFragment = (AlarmFragment)getParentFragment();//因为这里是Fragment嵌套Fragment于是是getParentFragment
    return view;
}

public void sendMessage(){
    Message message = handler.obtainMessage();
    message.sendToTarget();
}
4. 优点

这样做的好处就是,无论用户是一个Tab一个Tab的滑动,还是直接从Tab1跳到Tab4都是可以统计当前打开的Tab的数量,而且附近的Tab是不会被加载的。彻底像网易云的TabLayout功能一样。
是从参考资料中的例子获取的idea,不过发现他的例子只适用于一个Tab一个Tab的滑动,假如Tab跨越的幅度大了,应该会有一点问题吧,同时逻辑也比较复杂,还是跟感谢大神的贡献,才发现Handler又可以这样用,哈哈。


参考资料:(感谢大神的贡献)

Android标签页TabLayout控件实战及ViewPager取消预加载


好好学习,天天向上。<( ̄oo, ̄)/


ViewPager和TabLayout取消预加载_第2张图片
Potato_zero.jpg

你可能感兴趣的:(ViewPager和TabLayout取消预加载)