詳解Android 在 ViewPager 中使用 Fragment 的懶加載
我們先看一下效果:

首先,我們要知道什么是懶加載:
懶加載,就是先初始化控件,在用戶可見的時(shí)候再加載數(shù)據(jù)。
為什么要懶加載?
懶加載多被使用在新聞資訊類客戶端中,試想那么多的分類如果一下子都加載出來(lái),真的是極大地消耗了系統(tǒng)資源。可能有人會(huì)說(shuō) ViewPager 有 viewPager.setOffscreenPageLimit() 的方法,我們傳個(gè) 0 進(jìn)去不就好了嗎?看過(guò)源碼的應(yīng)該知道,即便你傳了 0 進(jìn)去,系統(tǒng)也會(huì)默認(rèn)為 1 的,也就是 ViewPager 依然會(huì)加載當(dāng)前頁(yè)面的前后各一個(gè) Fragment 。
我們首先為需要進(jìn)行懶加載的 Fragment 寫一個(gè)基類:
public abstract class LazyFragment extends Fragment {
// 控件是否初始化完成
// 我們?cè)诳丶跏蓟瓿芍笤龠M(jìn)行數(shù)據(jù)的加載,否則對(duì)控件進(jìn)行操作的時(shí)候會(huì)遇到空指針異常
protected boolean isViewCreated;
// 是否加載過(guò)數(shù)據(jù)
// 我們判斷未曾加載過(guò)數(shù)據(jù)的話再進(jìn)行獲取,否則每次對(duì)用戶可見時(shí)都會(huì)執(zhí)行懶加載的方法
protected boolean isLoadCompleted;
// 該方法只有在ViewPager與Fragment結(jié)合使用的時(shí)候才會(huì)執(zhí)行
// 該方法在onCreateView之前調(diào)用
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isViewCreated && !isLoadCompleted) {
// 只有在對(duì)用戶可見、控件初始化完成并且未曾加載過(guò)數(shù)據(jù)的情況下才進(jìn)行懶加載
lazyLoad();
isLoadCompleted = true;
}
}
// ViewPager的第一個(gè)Fragment默認(rèn)執(zhí)行setUserVisibleHint(fasle)方法
// 所以在activity創(chuàng)建完成后要讓第一頁(yè)也加載數(shù)據(jù)
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (getUserVisibleHint()) {
// 此處不需要判斷isViewCreated,因?yàn)檫@個(gè)方法在onCreateView方法之后執(zhí)行
lazyLoad();
isLoadCompleted = true;
}
}
// 懶加載,強(qiáng)制子類重寫
protected abstract void lazyLoad();
}
注釋已經(jīng)寫的很詳細(xì)了,接下來(lái)是子類的實(shí)現(xiàn):
public class NewsFragment extends LazyFragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_news, null);
initView(view); // 進(jìn)行控件的初始化
isViewCreated = true; // 控件初始化完成
return view;
}
@Override
protected void lazyLoad() {
// 加載數(shù)據(jù)
}
}
這樣 Fragment 的懶加載基本算是完成了。還有一點(diǎn)需要注意的是別忘記了寫:
//// 這行代碼一定要寫,否則會(huì)出現(xiàn)奇葩問(wèn)題 viewPager.setOffscreenPageLimit(fragments.size());
我這里是在 Activity 啟動(dòng)的時(shí)候初始化所有的 Fragment,打印日志會(huì)發(fā)現(xiàn)每個(gè) Fragemnt 的 onCreateView() 都執(zhí)行了,也就是說(shuō)控件全部初始化完畢,之后滑動(dòng)對(duì)用戶可見的時(shí)候執(zhí)行 setUserVisibleHint() 方法進(jìn)行數(shù)據(jù)的加載。
網(wǎng)上有很多關(guān)于懶加載的文章,也有多種的寫法。寫一個(gè)適合自己的,才是最好的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android將圖片轉(zhuǎn)換存到數(shù)據(jù)庫(kù)再?gòu)臄?shù)據(jù)庫(kù)讀取轉(zhuǎn)換成圖片實(shí)現(xiàn)代碼
有時(shí)候我們想把圖片存入到數(shù)據(jù)庫(kù)中,盡管這不是一種明智的選擇,但有時(shí)候還是不得以會(huì)用到,下面說(shuō)說(shuō)將圖片轉(zhuǎn)換成byte[]數(shù)組存入到數(shù)據(jù)庫(kù)中去,并從數(shù)據(jù)庫(kù)中取出來(lái)轉(zhuǎn)換成圖像顯示出來(lái)2013-11-11
Android幀率監(jiān)測(cè)與優(yōu)化技巧
Android 應(yīng)用的性能優(yōu)化是開發(fā)過(guò)程中至關(guān)重要的一環(huán),而幀率(Frame Rate)是評(píng)估應(yīng)用性能的一個(gè)關(guān)鍵指標(biāo),在本文中,我們將深入探討如何監(jiān)測(cè) Android 應(yīng)用的幀率,以及如何通過(guò)代碼示例來(lái)優(yōu)化應(yīng)用的性能,需要的朋友可以參考下2023-10-10
Android之RecyclerView輕松實(shí)現(xiàn)下拉刷新和加載更多示例
本篇文章主要介紹了Android之RecyclerView輕松實(shí)現(xiàn)下拉刷新和加載更多示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-02-02
基于Android SDK-在64位Linux中使用需要注意的問(wèn)題
本篇文章是對(duì)Android SDK-在64位Linux中使用需要注意的問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
探討:android項(xiàng)目開發(fā) 統(tǒng)籌兼顧 需要考慮的因素
本篇文章是對(duì)基于android項(xiàng)目開發(fā) 統(tǒng)籌兼顧 需要考慮的因素進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Android開發(fā)之InetAddress基礎(chǔ)入門簡(jiǎn)介與源碼實(shí)例
這篇文章主要介紹了Android開發(fā)之InetAddress基礎(chǔ)入門簡(jiǎn)介,需要的朋友可以參考下2020-03-03
Android開發(fā)之OkHttpUtils的具體使用方法
這篇文章主要介紹了Android開發(fā)之OkHttpUtils的具體使用方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08
Android序列化接口Parcelable與Serializable接口對(duì)比
我們使用 Intent 傳遞數(shù)據(jù)的時(shí)候,putExtra() 所支持的數(shù)據(jù)類型事有限的,當(dāng)需要傳遞自定義對(duì)象的時(shí)候就需要序列化。Serializable更簡(jiǎn)單但是會(huì)把整個(gè)對(duì)象進(jìn)行序列化因此效率比Parcelable低一些2023-02-02
如何在Android中實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能
隨著移動(dòng)端用戶越來(lái)越依賴視頻、文件下載以及大文件傳輸,斷點(diǎn)續(xù)傳作為一種有效節(jié)省帶寬和提高用戶體驗(yàn)的技術(shù)應(yīng)運(yùn)而生,本項(xiàng)目旨在實(shí)現(xiàn)一個(gè)基于?Android?的斷點(diǎn)續(xù)傳功能,需要的朋友可以參考下2025-04-04

