編輯:關於Android編程
大家在使用手機新聞客戶端的時候就會有一個發現,大多數的新聞客戶端都會把新聞分類,諸如頭條、娛樂、體育、科技等等,如何實現這種界面的呢?這個實現起來其實很簡單,就是在一個Fragment中實現多個ViewPage的切換,再在ViewPage的上面放一個TabLayout,關聯起來就可以實現聯動效果。如果大家感覺不太明了的話,以後我可以專門寫一篇關於Fragment中放入多個ViewPage的博客,今天,我主要介紹的是怎樣實現界面即Fragment的懶加載。那麼,大家就會奇怪了既然是加載界面直接加載就好了,為何還要使用懶加載呢?這就需要說一下懶加載的好處了。前文已經介紹過了,大多數新聞客戶端實現各種新聞切換的原理是一個Fragment中存放多個ViewPage,如果進入程序之後將所有的ViewPage中的數據都加載上的話,那麼無疑會增加APP運行時的負擔,而懶加載則可以實現程序啟動時fragment中的viewpage只預加載一個界面,等到滑到下一界面時再加載下一個viewpage的數據,並且實現加載界面緩存,下一次再切換到此界面時就不再重新加載了。好了,解釋清楚為何要用懶加載,下面就進入今天的正題吧。
第一步:自定義一個fragment讓他繼承Fragment
1、重寫setUserVisibleHint方法
2、定義一個抽象方法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){ //加載數據 isVisible = true; lazyInitData(); }else { isVisible = false; } } public abstract void lazyInitData(); }
第二步:再定義一個fragment繼承剛才定義的fragment
1、先定義一個全局變量來保存fragment的狀態(這一步是為緩存界面准備)定義兩個boolean型的變量分別表明fragment的視圖控件已經准備好以及當前fragment是否已經加載過數據
2、判斷fragment的狀態是不是為空,為空時再生成新界面
3、重寫父類的lazyInitData()方法實現懶加載
/** * A simple {@link Fragment} subclass. */ public class NetNewsFragment extends BaseFragment { //定義一個全局變量用來保存Fragment的狀態 private View v; //listview展示的數據 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) { //將布局關聯起來 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); //界面已經准備完畢 isPrepared = true; (new android.os.Handler()).postDelayed(new Runnable() { @Override public void run() { lazyInitData(); } },200); } return v; } /** * 初始化Fragment數據的方法,實現懶加載 */ @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的樣式監聽我都省略了,而這裡(new android.os.Handler()).postDelayed(new Runnable())中的方法是用多線程的方式實現了異步加載繼而達到初始化布局時有時間生成界面組件然後再加載數據。
至此,安卓中實現界面(Fragment)數據懶加載的目的就達到了。大家以後若是想要實現多張界面切換並且數據需要網絡請求的話,建議多使用懶加載。
好了,關於懶加載的介紹就說到這裡。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
書接上篇 《Android網絡請求庫 - Say hello to OkHttp》,今天接著來簡單的看一下常用的網絡請求庫中的第二種庫:Volley。 Volley是谷歌
引子作為程序員,借鑒可能是工作中所必須碰到的事情,程序員的世界裡,更多的不是從無到有,而是從有到優。那麼當我們在做一些需求或者架構調整時,可能需要參考別的成熟公司的做法,
一這是本人第一次寫博客 請多多關照第一次接觸到Android NDK 真是蒙圈 因為需要和Bluetooth下位機接觸 所以要在項目中鑲嵌Cpp 算法 然後總結了andr
我們常常在開發的時候,通過獲取系統已啟動的服務來判斷該服務器是否還需要再啟動。 而本文將介紹android設備中已啟動的服務,並判斷某一服務是啟動 1.根據ACTIV