編輯:關於android開發
大家在使用手機新聞客戶端的時候就會有一個發現,大多數的新聞客戶端都會把新聞分類,諸如頭條、娛樂、體育、科技等等,如何實現這種界面的呢?這個實現起來其實很簡單,就是在一個Fragment中實現多個ViewPage的切換,再在ViewPage的上面放一個TabLayout,關聯起來就可以實現聯動效果。如果大家感覺不太明了的話,以後我可以專門寫一篇關於Fragment中放入多個ViewPage的博客,今天,我主要介紹的是怎樣實現界面即Fragment的懶加載。那麼,大家就會奇怪了既然是加載界面直接加載就好了,為何還要使用懶加載呢?這就需要說一下懶加載的好處了。前文已經介紹過了,大多數新聞客戶端實現各種新聞切換的原理是一個Fragment中存放多個ViewPage,如果進入程序之後將所有的ViewPage中的數據都加載上的話,那麼無疑會增加APP運行時的負擔,而懶加載則可以實現程序啟動時fragment中的viewpage只預加載一個界面,等到滑到下一界面時再加載下一個viewpage的數據,並且實現加載界面緩存,下一次再切換到此界面時就不再重新加載了。好了,解釋清楚為何要用懶加載,下面就進入今天的正題吧。
第一步:自定義一個fragment讓他繼承Fragment
1、重寫setUserVisibleHint方法
2、定義一個抽象方法lazyInitData()1 package com.jereh.jinritoutiao.fragmentdemo.fragment; 2 3 import android.support.v4.app.Fragment; 4 5 /** 6 * Created by zhangdi on 2016/8/8. 7 */ 8 public abstract class BaseFragment extends Fragment { 9 protected boolean isVisible = false; 10 @Override 11 public void setUserVisibleHint(boolean isVisibleToUser) { 12 super.setUserVisibleHint(isVisibleToUser); 13 if (isVisibleToUser){ 14 //加載數據 15 isVisible = true; 16 lazyInitData(); 17 }else { 18 isVisible = false; 19 } 20 } 21 public abstract void lazyInitData(); 22 }
第二步:再定義一個fragment繼承剛才定義的fragment
1、先定義一個全局變量來保存fragment的狀態(這一步是為緩存界面准備)定義兩個boolean型的變量分別表明fragment的視圖控件已經准 備好以及當前fragment是否已經加載過數據
2、判斷fragment的狀態是不是為空,為空時再生成新界面
3、重寫父類的lazyInitData()方法實現懶加載1 /** 2 * A simple {@link Fragment} subclass. 3 */ 4 public class NetNewsFragment extends BaseFragment { 5 //定義一個全局變量用來保存Fragment的狀態 6 private View v; 7 //listview展示的數據 8 private List<NetNews> mData; 9 private PullToRefreshListView lv; 10 @Override 11 public void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 String u= getArguments().getString("api"); 14 if(!TextUtils.isEmpty(u)){ 15 url = u; 16 } 17 } 18 19 @Override 20 public View onCreateView(LayoutInflater inflater, ViewGroup container, 21 Bundle savedInstanceState) { 23 if(v==null) { 24 //將布局關聯起來 25 v = inflater.inflate(R.layout.fragment_net_news, container, false); 26 //找到ViewPage 27 lv = (PullToRefreshListView) v.findViewById(R.id.lv01); 28 mData = new ArrayList<>(); 29 //初始化適配器 30 adapter = new NetNewsAdapter(mData, getActivity()); 31 lv.setAdapter(adapter); 32 //界面已經准備完畢 33 isPrepared = true; 34 (new android.os.Handler()).postDelayed(new Runnable() { 35 @Override 36 public void run() { 37 lazyInitData(); 38 } 39 },200); 40 } 41 return v; 42 } 43 44 /** 45 * 初始化Fragment數據的方法,實現懶加載 46 */ 47 @Override 48 public void lazyInitData() { 49 if (isPrepared&&isVisible&&isFirst){ 50 lv.setRefreshing(); 51 VolleyUtil.get(url+"?num=20&page="+page) 52 .setCallBack(new NetCallBack()) 53 .build() 54 .addRequestHeader("apikey", Constants.API_KEY) 55 .start(); 56 isFirst = false; 57 } 58 }
這裡我為了將懶加載的代碼凸顯出來,所以PullToListView的樣式監聽我都省略了,而這裡(new android.os.Handler()).postDelayed(new Runnable())中的方法是用多線程的方式實現了異步加載繼而達到初始化布局時有時間生成界面組件然後再加載數據。
至此,安卓中實現界面(Fragment)數據懶加載的目的就達到了。大家以後若是想要實現多張界面切換並且數據需要網絡請求的話,建議多使用懶加載。好了,關於懶加載的介紹就說到這裡,如果大家感覺筆者寫的還不錯的話就麻煩推薦一下,若是感覺筆者哪個地方介紹的不好或是知識點有什麼不對的話希望評論指正,謝謝。
Android 旋轉屏幕--處理Activity與AsyncTask的最佳解決方案,androidasynctask一、概述 運行時變更就是設備在運行時發生變化(例如屏幕
Android 實現 IOS相機滑動控件,androidios IOS相比於Android,動畫效果是一方面優勢,IOS相機切換時滑動的動畫很不錯,看著是有
【Bugly 技術干貨】Android開發必備知識:為什麼說Kotlin值得一試,buglykotlin1、Hello, Kotlin Bugly 技術干貨系列內容主要涉
Accessibility輔助功能--一念天堂,一念地獄,一念天堂一念地獄0x00什麼是Accessibility(輔助功能) 考慮到部分用戶不能很好地使用Android