Fragment結合ViewPager之懶加載

什么是懶加載?為什么要用懶加載?###

1、什么是懶加載

懶加載就是當ViewPager和Fragment結合在一起使用時,Fragment呈現在用戶面前時才加載數據,當其從未被呈現在用戶面前時,不會執行加載數據的代碼。這就是我所理解的懶加載。

2、為什么要用懶加載

ViewPager默認會預加載下一頁,對于某些重量級的Fragment來說無疑會造成很大的開銷,當然了,如果對于你來說這些開銷是必要的,也不必無腦用懶加載。

背景簡介

很多時候我們都會將ViewPager和Fragment結合在一起使用,因為Android給我們提供了非常便利的FragmentPageAdapter,而這個adapter實現起來非常簡單:

public class TechFragmentPageAdapter extends FragmentPagerAdapter {private List<Fragment> fragmentList;public TechFragmentPageAdapter(FragmentManager fm, List<Fragment> fragmentList) {super(fm);this.fragmentList = fragmentList;}@Overridepublic Fragment getItem(int position) {return fragmentList.get(position);}@Overridepublic int getCount() {return fragmentList.size();}
}
復制代碼

現在我們一般的Activity都是繼承于AppCompatActivity,而這個activity可以

getSupportFragmentManager();
復制代碼

那么在實現以上的adapter時我們只要傳入我們的fragmentList就可以了。這樣的adapter既看起來舒服,又好使。但是ViewPager默認會加載下一頁,當你調用setOffscreenPageLimit(),并且將值設置為0,抱歉,沒啥用,因為當你設置的值小于1的時候默認還是1。那么,這個時候就需要我們自己去實現懶加載了。

實現

實現懶加載的關鍵是在于以下兩個方法:

/*** 文檔對于這個方法的描述是:Set a hint to the system about whether this * fragment's UI is currently visible to the user.**/
getUserVisibleHint()
setUserVisibleHint(boolean isVisibleToUser)
復制代碼

接下來讓我通過一段Log來了解這段故事,因為代碼結構比較簡單,只放其中的一段代碼上來,其他的,靠我們腦補就行了。

public class FirstFragment extends Fragment {private static final String TAG = "FirstFragment";@Overridepublic void onAttach(Context context) {Log.e(TAG, "onAttach");super.onAttach(context);}@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {Log.e(TAG, "onCreate");super.onCreate(savedInstanceState);}@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {Log.e(TAG, "onCreateView");return super.onCreateView(inflater, container, savedInstanceState);}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {Log.e(TAG, "onActivityCreated");super.onActivityCreated(savedInstanceState);}@Overridepublic void onStart() {Log.e(TAG, "onStart");super.onStart();}@Overridepublic void onResume() {Log.e(TAG, "onResume");super.onResume();}@Overridepublic void onPause() {Log.e(TAG, "onPause");super.onPause();}@Overridepublic void onStop() {Log.e(TAG, "onStop");super.onStop();}@Overridepublic void onDestroyView() {Log.e(TAG, "onDestroyView");super.onDestroyView();}@Overridepublic void onDestroy() {Log.e(TAG, "onDestroy");super.onDestroy();}@Overridepublic void onDetach() {Log.e(TAG, "onDetach");super.onDetach();}@Overridepublic boolean getUserVisibleHint() {Log.e(TAG, "getUserVisibleHint");return super.getUserVisibleHint();}@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {super.setUserVisibleHint(isVisibleToUser);Log.e(TAG, "setUserVisibleHint:" + isVisibleToUser);}
}復制代碼

非常簡單的一個Fragment,我只是在其中的各個方法中加入了Log這個操作而已,為了方便查看我使用了e這個級別的日志。類似的Fragment還有SecondFragment和ThirdFragment。當我使用FragmentPagerAdapter和ViewPager的時候,他們的Log輸出如下:

首先和我們預料的一樣,ViewPager的確有加載下一頁的特性,然后我們滑動到第二頁查看Log。

我們可以發現,當我們滑動到第二頁時,第三頁開始預加載,而且第二頁的setUserVisibleHint中的值已經被置為了true。也就是說當前頁面可見時,我們調用getUserVisibleHint()的值是true。那么我們可以根據這個特性去實現懶加載:

** 當前頁面不可見,但是ViewPager預加載的時候,我們判斷當前頁面是否可見,不可見則不進行加載數據的操作,僅僅做布局初始化的工作。在當前頁面變為可用的時候,我們調用加載數據的方法,那么數據便在ViewPager滑動到當前頁面的時候開始加載了。**

以下是我封裝的代碼,我封裝無力,各位如果覺得可以便自取,如果覺得不行可以自己改進~

package com.lauren.simplenews.news.widget;import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;/*** Created by Luo_xiasuhuei321@163.com on 2016/8/29.** 實現懶加載的Fragment*/
public abstract class BaseLazyFragment extends Fragment {protected View mRootView;protected Context mContext;protected boolean isVisible;private boolean isPrepared;private boolean isFirst = true;//--------------------system method callback------------------------//@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);isPrepared = true;initPrepare();}@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {super.setUserVisibleHint(isVisibleToUser);if(getUserVisibleHint()){isVisible = true;lazyLoad();}else{isVisible = false;onInvisible();}}@Overridepublic void onResume() {super.onResume();if(getUserVisibleHint()){setUserVisibleHint(true);}}@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);mContext = getActivity();}@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {if(mRootView == null){mRootView = initView(inflater,container,savedInstanceState);}return mRootView;}//--------------------------------method---------------------------///*** 懶加載*/protected void lazyLoad(){if(!isPrepared || !isVisible || !isFirst){return;}initData();isFirst = false;}//--------------------------abstract method------------------------///*** 在onActivityCreated中調用的方法,可以用來進行初始化操作。*/protected abstract void initPrepare();/*** fragment被設置為不可見時調用*/protected abstract void onInvisible();/*** 這里獲取數據,刷新界面*/protected abstract void initData();/*** 初始化布局,請不要把耗時操作放在這個方法里,這個方法用來提供一個* 基本的布局而非一個完整的布局,以免ViewPager預加載消耗大量的資源。*/protected abstract View initView(LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState);
}
復制代碼

###后話### 最近我搭建了自己的個人博客,雖然今天(9.2)沒時間完善了,但是以后有空我會完善一下的。而且有些文章我也不會再簡書更新……比如我想把我的java回爐重造一下……但是有關java的這些東西不怎么想放到簡書上,還是放到我自己的小窩里~

最后附上鏈接吧:https://xiasuhuei321.github.io 恩,域名暫時沒買,先就這么用著吧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453450.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453450.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453450.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WCF和webservice的區別

微軟論壇的斑竹回答如下&#xff1a; 腦內&#xff1a;果然是高大上啊 1.WebService&#xff1a;嚴格來說是行業標準&#xff0c;不是技術&#xff0c;使用XML擴展標記語言來表示數據&#xff08;這個是夸語言和平臺的關鍵&#xff09;。微 軟的Web服務實現稱為ASP.NET Web Ser…

職場不得不明白的十大定律

帕金森定律 美國著名歷史學家諾斯古德?帕金森通過長期調查研究&#xff0c;寫了一本名叫《帕金森定律》的書&#xff0c;他在書中闡述了機構人員膨脹的原因及后果&#xff1a;一個不稱職的官員&#xff0c;可能有三條出路。第一是申請退職&#xff0c;把位子讓給能干的人&am…

php控制器教程,laravel基礎教程 -- 控制器

HTTP 控制器簡介控制器允許你將相應的路由業務邏輯封裝在控制器類中進行有效的管理&#xff0c;這樣你不必將所有的路由邏輯集中到routes.php文件中&#xff0c;導致代碼的臃腫與難以維護。所有的控制器類都被存儲在app/Http/Controllers目錄中.基本控制器一個基本的控制器應該…

org.apache.jasper.JasperException: Unable to compile class for JSP:

報錯信息&#xff1a; org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 1 in the generated java file The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class filesSt…

i++和++i

關于自增自減運算&#xff0c;很多書籍沒有把問題講清楚,在C語言里是這樣的&#xff1a; 1.后置運算&#xff1a;k表示先運算&#xff0c;后自加。 意思是遇到k了&#xff0c;我先把當前的k的值拿來參加運算&#xff0c;后面再去管它的自加。 那么&#xff0c;“后面”后到什么…

什么樣的項目經歷會讓面試官眼前一亮

很多同學都問過我類似的問題&#xff1a; 咱們《C語言也能干大事》中講的自己動手寫windows優化大師、自己動手寫計算器等東西只是寫著玩的小玩具而已&#xff0c;這些能用來以后找工作時寫到簡歷中的作品嗎&#xff1f;看別人的簡歷寫的“圖書管理系統”、“教務選課系統”多有…

matlab采樣頻譜,Matlab對采樣數據進行頻譜分析

使用Matlab對采樣數據進行頻譜分析1、采樣數據導入Matlab采樣數據的導入至少有三種方法。第一就是手動將數據整理成Matlab支持的格式&#xff0c;這種方法僅適用于數據量比較小的采樣。第二種方法是使用Matlab的可視化交互操作&#xff0c;具體操作步驟為&#xff1a;File --&g…

鏈表和順序表的一些區別

順序表與鏈表是非常基本的數據結構&#xff0c;它們可以被統稱為線性表。 線性表&#xff08;Linear List&#xff09;是由 n&#xff08;n≥0&#xff09;個數據元素&#xff08;結點&#xff09;a[0]&#xff0c;a[1]&#xff0c;a[2]…&#xff0c;a[n-1] 組成的有限序列。…

ANCS推送簡介

總體原理 ANCS通過藍牙BLE 4.0實現&#xff0c;僅支持iPhone 4S及以上且系統版本在IOS 7以上的手機&#xff0c;同時在外設端需要支持藍牙4.0協議。 1、外設端進行廣播&#xff0c;手機打開藍牙&#xff0c;搜索外設&#xff0c;連接外設&#xff0c;之后進行綁定&#xff08;這…

好記性不如爛筆頭,記錄幾個常用的Linux操作

作者&#xff1a;老王Shell公共函數庫Linux系統里有一些公共的Shell函數庫可供使用&#xff0c;最重要的是/etc/rc.d/init.d/functions&#xff0c;在/etc/init.d目錄下有很多腳本都用到了這個函數庫&#xff0c;里面提供了很多有用的方法&#xff0c;比如&#xff1a;killproc…

用matlab簡單電路模型,基于MATLAB的電路模型仿真應用

基于MATLAB的電路模型仿真應用實驗指導書一、實驗目的1、掌握采用M文件及SIMULINK對電路進行仿真的方法。2、熟悉POWERSYSTEM BLOCKSET 模塊集的調用、設置方法。3&#xff0e;進一步熟悉M腳本文件編寫的方法和技巧。二、實驗原理1、通過M文件實現電路仿真的一般仿真步驟為&…

春節期間小游戲同時在線人數最高達2800萬人/小時

微信官方發布2018年春節期間微信數據報告&#xff1a;除夕至初五&#xff0c;總共有2,297億條微信消息&#xff0c;28億條微信朋友圈成功發出&#xff0c;音視頻通話總時長175億乙分鐘。其中&#xff0c;90后用廣的消息發送量占總量的42.5%&#xff0c;80后用戶25.9%&#xff0…

C語言中* 和

&x是對x變量取地址&#xff0c;也就是返回的是x的地址。 int *i;這里面的*說明變量i是一個指針&#xff0c;存的是一個地址。 而 *i整體代表的是一個數值&#xff0c;例如可以int *i 5 這里整體的*i代表的是5&#xff0c;而i代表的是這個值存儲的地址

餐館的故事-淺析職責鏈模式

我們在餐館吃飯的時候&#xff0c;一般都是在拿到菜單后&#xff0c;選擇喜歡的菜&#xff0c;然后通知服務員。服務員會將我們的定單交給大廚&#xff0c;大廚可能會親自去做這道菜&#xff0c;也可能安排給小廚來做&#xff0c;總之&#xff0c;我們不用擔心他們沒有人做菜&a…

JDBC數據對象存儲

一&#xff1a;將查詢的結果生成對象&#xff0c;儲存在數組中。 1 package day31;2 3 import java.sql.Connection;4 import java.sql.PreparedStatement;5 import java.sql.ResultSet;6 import java.sql.SQLException;7 import java.util.ArrayList;8 9 public class java_ob…

個人工作13年的一些人生真實領悟

此文不定期的更新&#xff0c;想起來就寫一些&#xff0c;我都忘了我曾經會過什么了。你可能會在許多的文章里看到類似的&#xff0c;但這些是我個人的真實體會。 1 技術服從于業務 此問題以前的一個文章提過&#xff0c;不再多說。 適用于大多數對技術的盲目崇拜者。在絕大…

matlab非齊次方程組的通解,用matlab求非齊次線性方程組的通解?

先向大家介紹一下非齊次線性方程組。所謂非齊次線性方程組就是方程組等號右邊的常數項不全為零的線性方程組。全部等于零時&#xff0c;就稱為齊次線性方程組。下面我們就講解一下如何利用matlab快速求非齊次線性方程組的通解。工具/材料matlab電腦操作方法01線性方程組Axb的求…

Linux 終端仿真程序Putty

PuTTY是一個Telnet、SSH、rlogin、純TCP以及串行接口連接軟件。較早的版本僅支持Windows平臺&#xff0c;現在的版本中開始支持各類Unix平臺。 用linux作為桌面系統&#xff0c;身為工程師很多時候需要通過Telnet、SSH協議進行遠程管理&#xff0c;通過串口進行設備配置。Putty…

Mysql 數據庫水平分表 存儲過程

數據庫存儲量達到一定程度的時候&#xff0c;就需要進行分表以減輕檢索的消耗。 常用的分表方式包括水平和垂直分表。本次進行的是按照uid進行水平分表。 ##分表思路&#xff1a; 水平分表平均的將數據按照特定方式分配到多個表中。理論上每個表的訪問頻次和數據量都是同一水平…

中國架構師,名符其實有多少?

先說一下讀后感&#xff1a;我前段時間去過幾個公司面試架構師&#xff0c;要求還是蠻高的&#xff0c;要熟悉大數據量處理&#xff0c;要熟悉高并發&#xff0c;要熟悉XX體系架構&#xff0c;要能在關鍵技術上實現突破。總之&#xff0c;架構錯了&#xff0c;就啥都錯了。呵呵…