本文轉載自:http://blog.csdn.net/q844258542/article/details/51525749(非常感謝博主的分享)
項目當中使用到tablayout+viewpager+fragment組合, 也是現在app非常流行的一種設計.
viewpager切換頁面時,讓fragment進行懶加載操作,是比較好的體驗,節省省流量,避免預加載時造成的卡頓現象.
懶加載操作主要使用到fragment 的 setUserVisibleHint() , 及getUserVisibleHint()方法
setUserVisibleHint() 方法在viewpageradapter內部調用, 會爲fragment 進行賦值, 如果fragment 不可見賦值爲false. 反之爲true.
getUserVisibleHint() 方法是獲取這個值, 通過fragment 當前是否可見, 來進行加載數據的操作, 這樣就實現了預加載的功能.
- package cn.cibn.haokan.ui.categoryList;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import cn.cibn.haokan.ui.base.ImgBaseFragment;
- public abstract class LazyFragment extends ImgBaseFragment{
- /**
- * Fragment title
- */
- public String fragmentTitle;
- /**
- * 是否可見狀態
- */
- private boolean isVisible;
- /**
- * 標誌位,View已經初始化完成。
- * 2016/04/29
- * 用isAdded()屬性代替
- * 2016/05/03
- * isPrepared還是準一些,isAdded有可能出現onCreateView沒走完但是isAdded了
- */
- private boolean isPrepared;
- /**
- * 是否第一次加載
- */
- private boolean isFirstLoad = true;
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- // 若 viewpager 不設置 setOffscreenPageLimit 或設置數量不夠
- // 銷燬的Fragment onCreateView 每次都會執行(但實體類沒有從內存銷燬)
- // 導致initData反覆執行,所以這裏註釋掉
- // isFirstLoad = true;
- // 2016/04/29
- // 取消 isFirstLoad = true的註釋 , 因爲上述的initData本身就是應該執行的
- // onCreateView執行 證明被移出過FragmentManager initData確實要執行.
- // 如果這裏有數據累加的Bug 請在initViews方法裏初始化您的數據 比如 list.clear();
- isFirstLoad = true;
- View view = initViews(inflater, container, savedInstanceState);
- isPrepared = true;
- lazyLoad();
- return view;
- }
- /**
- * 如果是與ViewPager一起使用,調用的是setUserVisibleHint
- *
- * @param isVisibleToUser 是否顯示出來了
- */
- @Override
- public void setUserVisibleHint(boolean isVisibleToUser) {
- super.setUserVisibleHint(isVisibleToUser);
- if (getUserVisibleHint()) {
- isVisible = true;
- onVisible();
- } else {
- isVisible = false;
- onInvisible();
- }
- }
- /**
- * 如果是通過FragmentTransaction的show和hide的方法來控制顯示,調用的是onHiddenChanged.
- * 若是初始就show的Fragment 爲了觸發該事件 需要先hide再show
- *
- * @param hidden hidden True if the fragment is now hidden, false if it is not
- * visible.
- */
- @Override
- public void onHiddenChanged(boolean hidden) {
- super.onHiddenChanged(hidden);
- if (!hidden) {
- isVisible = true;
- onVisible();
- } else {
- isVisible = false;
- onInvisible();
- }
- }
- protected void onVisible() {
- lazyLoad();
- }
- protected void onInvisible() {
- }
- /**
- * 要實現延遲加載Fragment內容,需要在 onCreateView
- * isPrepared = true;
- */
- protected void lazyLoad() {
- if (isPrepared && isVisible && isFirstLoad) {
- isFirstLoad = false;
- initData();
- }
- }
- protected abstract View initViews(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);
- protected abstract void initData();
- }