ViewPager和TabLayout取消預(yù)加載

╮(╯▽╰)╭寫了這么多篇Android的文章都沒人看,估計也因為自己寫的文章都比較皮毛。
其實每一次遇到問題第一時間都是來簡書搜,簡書沒有再百度。一直都覺得簡書里的大神寫的會比較用心,像RxJava和Picasso都是在簡書找到的文章學(xué)會的。
因為這篇文章在簡書還沒完善的解決方案,于是我簡化的大神的思路,在此獻(xiàn)丑了。

最終效果:(即將顯示的Fragment是還沒加載的,如何實現(xiàn)呢)

wuli大網(wǎng)易云

實現(xiàn)思路:

Android中ViewPager和TabLayout組合使用真的是太方便了,一開始因為它預(yù)加載附近的頁面解決了很久都沒實現(xiàn),差點就不想用它了。不過現(xiàn)在發(fā)現(xiàn),它還是很有愛的。

在ViewPager中有一個方法:
setOffscreenPageLimit(int limit),這是預(yù)告加載的頁面數(shù)量,默認(rèn)是1,就算設(shè)置0了,還是會默認(rèn)改成1。(這個沒關(guān)系,這個反而方便了我們,接下來的工作)
假如頁面的tab數(shù)量是4個,像網(wǎng)易云一樣,當(dāng)4個頁面都加載過后,除非下拉更新,否則無論頁面間怎么切換數(shù)據(jù)都不會變。這時候我們就viewpager.setOffscreenPageLimit(4);

1. 讓TabFragment頁面onCreateView不做任何加載數(shù)據(jù)操作

既然setOffscreenPageLimit是不能指望取消預(yù)加載,那我們就直接放棄它了,同時也讓onCreateView不做加載數(shù)據(jù)操作。

@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的頁面中聲明一些屬性,和根據(jù)滑動的position加載數(shù)據(jù)

本文在AlarmFragment中使用了ViewPager和TabLayout

public int totalTabNum = 4;//假如有四個Fragment頁面
public int openTabNum = 0;//當(dāng)前已打開的頁面數(shù)量

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) {
                //滑動監(jiān)聽加載數(shù)據(jù),一次只加載一個標(biāo)簽頁
                if(openTabNum < totalTabNum){
                    ((TabFragment)fragmentPagerAdapter.getItem(position)).sendMessage();
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }
}
3. 回到TabFragment中,讓Handler加載數(shù)據(jù)
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();//加載網(wǎng)絡(luò)數(shù)據(jù)的方法
        }
        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. 優(yōu)點

這樣做的好處就是,無論用戶是一個Tab一個Tab的滑動,還是直接從Tab1跳到Tab4都是可以統(tǒng)計當(dāng)前打開的Tab的數(shù)量,而且附近的Tab是不會被加載的。徹底像網(wǎng)易云的TabLayout功能一樣。
是從參考資料中的例子獲取的idea,不過發(fā)現(xiàn)他的例子只適用于一個Tab一個Tab的滑動,假如Tab跨越的幅度大了,應(yīng)該會有一點問題吧,同時邏輯也比較復(fù)雜,還是跟感謝大神的貢獻(xiàn),才發(fā)現(xiàn)Handler又可以這樣用,哈哈。


參考資料:(感謝大神的貢獻(xiàn))

Android標(biāo)簽頁TabLayout控件實戰(zhàn)及ViewPager取消預(yù)加載


好好學(xué)習(xí),天天向上。<( ̄oo, ̄)/


Potato_zero.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容