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

實現(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, ̄)/
