Android界面數(shù)據(jù)懶加載實(shí)現(xiàn)代碼
大家在使用手機(jī)新聞客戶端的時(shí)候就會有一個(gè)發(fā)現(xiàn),大多數(shù)的新聞客戶端都會把新聞分類,諸如頭條、娛樂、體育、科技等等,如何實(shí)現(xiàn)這種界面的呢?這個(gè)實(shí)現(xiàn)起來其實(shí)很簡單,就是在一個(gè)Fragment中實(shí)現(xiàn)多個(gè)ViewPage的切換,再在ViewPage的上面放一個(gè)TabLayout,關(guān)聯(lián)起來就可以實(shí)現(xiàn)聯(lián)動(dòng)效果。如果大家感覺不太明了的話,以后我可以專門寫一篇關(guān)于Fragment中放入多個(gè)ViewPage的博客,今天,我主要介紹的是怎樣實(shí)現(xiàn)界面即Fragment的懶加載。那么,大家就會奇怪了既然是加載界面直接加載就好了,為何還要使用懶加載呢?這就需要說一下懶加載的好處了。前文已經(jīng)介紹過了,大多數(shù)新聞客戶端實(shí)現(xiàn)各種新聞切換的原理是一個(gè)Fragment中存放多個(gè)ViewPage,如果進(jìn)入程序之后將所有的ViewPage中的數(shù)據(jù)都加載上的話,那么無疑會增加APP運(yùn)行時(shí)的負(fù)擔(dān),而懶加載則可以實(shí)現(xiàn)程序啟動(dòng)時(shí)fragment中的viewpage只預(yù)加載一個(gè)界面,等到滑到下一界面時(shí)再加載下一個(gè)viewpage的數(shù)據(jù),并且實(shí)現(xiàn)加載界面緩存,下一次再切換到此界面時(shí)就不再重新加載了。好了,解釋清楚為何要用懶加載,下面就進(jìn)入今天的正題吧。
第一步:自定義一個(gè)fragment讓他繼承Fragment
1、重寫setUserVisibleHint方法
2、定義一個(gè)抽象方法lazyInitData()
package com.jereh.jinritoutiao.fragmentdemo.fragment; import android.support.v4.app.Fragment; /** * Created by zhangdi on 2016/8/8. */ public abstract class BaseFragment extends Fragment { protected boolean isVisible = false; @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser){ //加載數(shù)據(jù) isVisible = true; lazyInitData(); }else { isVisible = false; } } public abstract void lazyInitData(); }
第二步:再定義一個(gè)fragment繼承剛才定義的fragment
1、先定義一個(gè)全局變量來保存fragment的狀態(tài)(這一步是為緩存界面準(zhǔn)備)定義兩個(gè)boolean型的變量分別表明fragment的視圖控件已經(jīng)準(zhǔn)備好以及當(dāng)前fragment是否已經(jīng)加載過數(shù)據(jù)
2、判斷fragment的狀態(tài)是不是為空,為空時(shí)再生成新界面
3、重寫父類的lazyInitData()方法實(shí)現(xiàn)懶加載
/** * A simple {@link Fragment} subclass. */ public class NetNewsFragment extends BaseFragment { //定義一個(gè)全局變量用來保存Fragment的狀態(tài) private View v; //listview展示的數(shù)據(jù) private List<NetNews> mData; private PullToRefreshListView lv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String u= getArguments().getString("api"); if(!TextUtils.isEmpty(u)){ url = u; } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if(v==null) { //將布局關(guān)聯(lián)起來 v = inflater.inflate(R.layout.fragment_net_news, container, false); //找到ViewPage lv = (PullToRefreshListView) v.findViewById(R.id.lv01); mData = new ArrayList<>(); //初始化適配器 adapter = new NetNewsAdapter(mData, getActivity()); lv.setAdapter(adapter); //界面已經(jīng)準(zhǔn)備完畢 isPrepared = true; (new android.os.Handler()).postDelayed(new Runnable() { @Override public void run() { lazyInitData(); } },200); } return v; } /** * 初始化Fragment數(shù)據(jù)的方法,實(shí)現(xiàn)懶加載 */ @Override public void lazyInitData() { if (isPrepared&&isVisible&&isFirst){ lv.setRefreshing(); VolleyUtil.get(url+"?num=20&page="+page) .setCallBack(new NetCallBack()) .build() .addRequestHeader("apikey", Constants.API_KEY) .start(); isFirst = false; } }
這里我為了將懶加載的代碼凸顯出來,所以PullToListView的樣式監(jiān)聽我都省略了,而這里(new android.os.Handler()).postDelayed(new Runnable())中的方法是用多線程的方式實(shí)現(xiàn)了異步加載繼而達(dá)到初始化布局時(shí)有時(shí)間生成界面組件然后再加載數(shù)據(jù)。
至此,安卓中實(shí)現(xiàn)界面(Fragment)數(shù)據(jù)懶加載的目的就達(dá)到了。大家以后若是想要實(shí)現(xiàn)多張界面切換并且數(shù)據(jù)需要網(wǎng)絡(luò)請求的話,建議多使用懶加載。
好了,關(guān)于懶加載的介紹就說到這里。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android 開發(fā)使用PopupWindow實(shí)現(xiàn)彈出警告框的復(fù)用類示例
- android PopupWindow 和 Activity彈出窗口實(shí)現(xiàn)方式
- android popwindow實(shí)現(xiàn)左側(cè)彈出菜單層及PopupWindow主要方法介紹
- Android Animation實(shí)戰(zhàn)之屏幕底部彈出PopupWindow
- Android編程實(shí)現(xiàn)popupwindow彈出后屏幕背景變成半透明效果
- Android實(shí)現(xiàn)底部彈出PopupWindow背景逐漸變暗效果
- Android之用PopupWindow實(shí)現(xiàn)彈出菜單的方法詳解
- Android中自定義PopupWindow實(shí)現(xiàn)彈出框并帶有動(dòng)畫效果
- Android中的popupwindow進(jìn)入和退出的動(dòng)畫效果
- Android簡單實(shí)現(xiàn)自定義彈框(PopupWindow)
- Android 開發(fā)使用PopupWindow實(shí)現(xiàn)加載等待界面功能示例
相關(guān)文章
為Retrofit統(tǒng)一添加post請求的默認(rèn)參數(shù)的方法
這篇文章主要介紹了為Retrofit統(tǒng)一添加post請求的默認(rèn)參數(shù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04解析android 流量監(jiān)測的實(shí)現(xiàn)原理
本篇文章是對android中流量監(jiān)測的實(shí)現(xiàn)原理進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Flutter源碼分析之自定義控件(RenderBox)指南
寫了兩天的flutter,發(fā)現(xiàn)控件樣式很多,flutter資源很少,本文在于實(shí)用性,可以減少頁面代碼,下面這篇文章主要介紹了Flutter源碼分析之自定義控件(RenderBox)的相關(guān)資料,需要的朋友可以參考下2021-08-08Android實(shí)現(xiàn)橡皮筋回彈和平移縮放效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)橡皮筋回彈和平移縮放效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Android對話框AlertDialog與DatePickerDialog及TimePickerDialog使用詳解
這篇文章主要介紹了Android對話框中的提醒對話框AlertDialog、日期對話框DatePickerDialog、時(shí)間對話框TimePickerDialog使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-09-09Android編程實(shí)現(xiàn)ActionBar的home圖標(biāo)動(dòng)畫切換效果
這篇文章主要介紹了Android編程實(shí)現(xiàn)ActionBar的home圖標(biāo)動(dòng)畫切換效果,涉及Android布局、樣式、Activity及菜單相關(guān)操作技巧,需要的朋友可以參考下2017-01-01Android studio gradle環(huán)境變量配置教程
這篇文章主要為大家詳細(xì)介紹了Android studio gradle環(huán)境變量配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05