日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ViewPager+Fragment懒加载

發布時間:2025/4/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ViewPager+Fragment懒加载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:http://blog.csdn.net/linglongxin24/article/details/53205878

Android中ViewPager+Fragment取消(禁止)預加載延遲加載(懶加載)問題解決方案

在Android中我們經常會用到ViewPager+Fragment組合。然而,有一個很讓人頭疼的問題就是,我們去加載數據的時候由于ViewPager的內部機制所限制,所以它會默認至少預加載一個。這讓人很郁悶,所以,我就想到要封裝一個Fragment來解決這個問題。

這里還解決一個問題就是在Android酷炫歡迎頁播放視頻,仿螞蜂窩自由行和慕課網,這里感謝有一位網友提出了bug,就是在播放視頻的時候如果滑動到第二頁和第三頁,第一頁的視頻還在播放,這是個讓人很頭疼的問題,在這里也完美解決。

1.問題初探

文章開始已經說過ViewPager的預加載機制。那么,我們可不可以設置ViewPager的預加載為0,不就解決問題了嗎?

vp.setOffscreenPageLimit(0);

經過測試發現,根本不是這么回事,為什么呢?我們來看看Viewpager的setOffscreenPageLimit()方法的源碼

private static final int DEFAULT_OFFSCREEN_PAGES = 1;/*** Set the number of pages that should be retained to either side of the* current page in the view hierarchy in an idle state. Pages beyond this* limit will be recreated from the adapter when needed.** <p>This is offered as an optimization. If you know in advance the number* of pages you will need to support or have lazy-loading mechanisms in place* on your pages, tweaking this setting can have benefits in perceived smoothness* of paging animations and interaction. If you have a small number of pages (3-4)* that you can keep active all at once, less time will be spent in layout for* newly created view subtrees as the user pages back and forth.</p>** <p>You should keep this limit low, especially if your pages have complex layouts.* This setting defaults to 1.</p>** @param limit How many pages will be kept offscreen in an idle state.*/public void setOffscreenPageLimit(int limit) {if (limit < DEFAULT_OFFSCREEN_PAGES) {Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to "+ DEFAULT_OFFSCREEN_PAGES);limit = DEFAULT_OFFSCREEN_PAGES;}if (limit != mOffscreenPageLimit) {mOffscreenPageLimit = limit;populate();}}

我們發現,即使你設置為0,那么還是會在里面判斷后設為默認值1。所以這個方法是行不通的。

2.問題再探

我們發現Fragment中有一個setUserVisibleHint(boolean isVisibleToUser)方法,這個方法就是告訴用戶,UI對用戶是否可見,那么我們在這里去加載數據會怎么樣呢?

這又是為什么呢?
因為ViewPager會加載好多Fragment,為了節省內容等會在Fragment不可見的某個時候調用onDestroyView()將用戶界面銷毀掉但是Fragment的實例還在,所以可能第一次加載沒有問題,
但是再次回到第一個Fragment再去加載的時候就會出現UI對用戶可見但是視圖還沒有初始化。

3.最終解決方案

package cn.bluemobi.dylan.viewpagerfragmentlazyload;import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast;/*** Fragment預加載問題的解決方案:* 1.可以懶加載的Fragment* 2.切換到其他頁面時停止加載數據(可選)* Created by yuandl on 2016-11-17.* blog :http://blog.csdn.net/linglongxin24/article/details/53205878*/public abstract class LazyLoadFragment extends Fragment {/*** 視圖是否已經初初始化*/protected boolean isInit = false;protected boolean isLoad = false;protected final String TAG = "LazyLoadFragment";private View view;@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {view = inflater.inflate(setContentView(), container, false);isInit = true;/**初始化的時候去加載數據**/isCanLoadData();return view;}/*** 視圖是否已經對用戶可見,系統的方法*/@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {super.setUserVisibleHint(isVisibleToUser);isCanLoadData();}/*** 是否可以加載數據* 可以加載數據的條件:* 1.視圖已經初始化* 2.視圖對用戶可見*/private void isCanLoadData() {if (!isInit) {return;}if (getUserVisibleHint()) {lazyLoad();isLoad = true;} else {if (isLoad) {stopLoad();}}}/*** 視圖銷毀的時候講Fragment是否初始化的狀態變為false*/@Overridepublic void onDestroyView() {super.onDestroyView();isInit = false;isLoad = false;}protected void showToast(String message) {if (!TextUtils.isEmpty(message)) {Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();}}/*** 設置Fragment要顯示的布局** @return 布局的layoutId*/protected abstract int setContentView();/*** 獲取設置的布局** @return*/protected View getContentView() {return view;}/*** 找出對應的控件** @param id* @param <T>* @return*/protected <T extends View> T findViewById(int id) {return (T) getContentView().findViewById(id);}/*** 當視圖初始化并且對用戶可見的時候去真正的加載數據*/protected abstract void lazyLoad();/*** 當視圖已經對用戶不可見并且加載過數據,如果需要在切換到其他頁面時停止加載數據,可以覆寫此方法*/protected void stopLoad() {}} }

4.用法

LazyLoadFragment是一個抽象類,可以作為BaseFragment,繼承它。

(1).用setContentView()方法去加載要顯示的布局

(2).lazyLoad()方法去加載數據

(3).stopLoad()方法可選,當視圖已經對用戶不可見并且加載過數據,如果需要在切換到其他頁面時停止加載數據,可以覆寫此方法

package cn.bluemobi.dylan.viewpagerfragmentlazyload;import android.util.Log;/** * Created by yuandl on 2016-11-17. */public class Fragment1 extends LazyLoadFragment {@Overridepublic int setContentView() {return R.layout.fm_layout1;}@Overrideprotected void lazyLoad() {String message = "Fragment1" + (isInit ? "已經初始并已經顯示給用戶可以加載數據" : "沒有初始化不能加載數據")+">>>>>>>>>>>>>>>>>>>";showToast(message);Log.d(TAG, message);}@Overrideprotected void stopLoad() {Log.d(TAG, "Fragment1" + "已經對用戶不可見,可以停止加載數據");} }

5.看效果界面

6.GitHub

總結

以上是生活随笔為你收集整理的ViewPager+Fragment懒加载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 无码人妻精品中文字幕 | 神马影院一区二区三区 | 伊人自拍| 国产欧美日韩精品在线观看 | 青娱乐最新地址 | 国内精品久久久久久久久 | 欧美男优| 日韩一级欧美 | 都市激情亚洲综合 | 国产精品av久久久久久无 | 国产情侣自拍av | 日韩图片区 | 欧美黑人又粗又大高潮喷水 | 成人欧美一区二区 | 嫩草伊人| 九九色| 丰满少妇久久久久久久 | 少妇脱了内裤让我添 | 国产偷怕| 欧美国产一级片 | 岛国二区三区 | 国产精品国产三级国产三级人妇 | 免费搞黄网站 | 国产依人 | 亚洲麻豆av| 露脸丨91丨九色露脸 | 色一情一乱一伦一区二区三区 | 不卡在线播放 | 欧美 日韩 国产 成人 在线观看 | 宅男午夜影院 | 国产精品黄色在线观看 | 亚洲色图19p | 免费看a的网站 | 久久大香焦 | 日韩在线黄色 | 刘亦菲毛片一区二区三区 | 精品久久久在线观看 | 老司机精品在线 | 青青草一区二区三区 | 精品在线一区二区 | 久久精品国产亚洲AV成人雅虎 | 三级不卡视频 | 国产aⅴ一区二区三区 | 国产911视频 | 九九激情网 | 青青av在线 | 性做久久久 | 欧美精品一区二区三区蜜臀 | 91精品国产综合久 | 邻居校草天天肉我h1v1 | 国产在线视频你懂得 | 成人免费公开视频 | 国产一区二区视频免费在线观看 | 亚洲图片欧美 | 91高清免费视频 | 偷偷操av| 啊v视频在线 | 特黄a级片 | 国产视频在线观看网站 | 一级大片在线观看 | jzjzjz欧美丰满少妇 | 久久久久久毛片 | 黄色动漫软件 | 午夜激情福利在线 | 久久久蜜桃一区二区人 | 久久成人乱码欧美精品一区二区 | 熟妇无码乱子成人精品 | 天天夜夜爽| 欧美在线播放视频 | 操女人视频网站 | 亚洲综合第一区 | 色婷婷激情综合 | 97人人精品 | 香蕉视频在线网站 | 在线观看亚洲大片短视频 | 欧美日韩成人一区二区 | 在线看日韩 | 69堂在线观看 | 少妇淫片 | 国产日韩欧美91 | 国产精品成人aaaaa网站 | 美女露出让男生揉的视频 | 少妇一级淫片免费放 | 一本久道久久综合无码中文 | 双性娇喘浑圆奶水h男男漫画 | 亚洲黄v | 久久99免费 | 国产一区二区三区网站 | 手机亚洲第一页 | 国产绿帽刺激高潮对白 | 麻豆三级在线观看 | 亚洲自拍偷拍在线 | 久久久久久久久久久久国产精品 | 久久久久亚洲av无码专区桃色 | 亚洲精品乱码 | 6680新视觉电影免费观看 | 欧美精品久久久久久久免费 | 久久久精选 | 欧美国产日韩一区二区三区 |