精华内容
下载资源
问答
  • Fragment懒加载预加载

    2020-10-26 22:31:02
    ,默认是预加载1,可以结合加载使用。  如果希望进入viewpager,Fragment只加载一次,再次滑动不需加载(只有退出Activity), 可以重写viewpager adapter的getItem,去掉super 2.加载   ...

     

     

    1. 预加载viewpager.setOffscreenPageLimit(2);,默认是预加载1,可以结合懒加载使用。

     

      如果希望进入viewpager,Fragment只加载一次,再次滑动不需加载(只有退出Activity),

     

    可以重写viewpager adapter的getItem,去掉super

     

     

    2.懒加载  

      public abstract class LazyFragment extends Fragment {  

                 protected boolean isVisible;  

                 /** 

                  * 在这里实现Fragment数据的缓加载. 

                  * @param isVisibleToUser 

                 */  

        @Override  

        public void setUserVisibleHint(boolean isVisibleToUser) {  

          super.setUserVisibleHint(isVisibleToUser);  

          if(getUserVisibleHint()) {  

                    isVisible = true;  

                    onVisible();  

               } else {  

                    isVisible = false;  

                    onInvisible();  

              }  

          }  

        protected void onVisible(){  

                lazyLoad();  

          }  

        protected abstract void lazyLoad();  

        protected void onInvisible(){}  

    }  

     

     

    public class OpenResultFragment extends LazyFragment{  

        // 标志位,标志已经初始化完成。  

        private boolean isPrepared;  

        @Override  

        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  

                Log.d(LOG_TAG, "onCreateView");  

                View view = inflater.inflate(R.layout.fragment_open_result, container, false);  

           //XXX初始化view的各控件  

              isPrepared = true;  

                lazyLoad();  

          return view;  

          }  

        @Override  

        protected void lazyLoad() {  

        if(!isPrepared || !isVisible) {  

          return;  

             }  

        //填充各控件的数据  

          }  

    }

    展开全文
  • Fragment懒加载

    2019-10-28 11:37:14
    解决viewpager加载多个fragment 设置预加载的方法失效问题 引入fragment懒加载 只有当页面显示的时候才被加载 主要使用到的方法:setUserVisibleHint()、userVisibleHint,界面显示到不显示,以及不显示到显示都会...

    解决viewpager加载多个fragment 设置预加载的方法失效问题 引入fragment懒加载

    只有当页面显示的时候才被加载

    主要使用到的方法:setUserVisibleHint()、userVisibleHint,界面显示到不显示,以及不显示到显示都会执行setUserVisibleHint方法

    
    abstract class LazyFragment: Fragment(){
        private var isPrepare:Boolean =false
        private var isLoaded:Boolean =false
    
        override fun onActivityCreated(savedInstanceState: Bundle?) {
            super.onActivityCreated(savedInstanceState)
            isPrepare=true
            lazyLoad()
        }
    
        override fun setUserVisibleHint(isVisibleToUser: Boolean) {
            super.setUserVisibleHint(isVisibleToUser)
            lazyLoad()
        }
    
        private fun lazyLoad() {
            if(userVisibleHint&&isPrepare&&!isLoaded){
                onLazyLoad()
                isLoaded=true
            }
        }
    
        abstract fun onLazyLoad()
    
    }
    
    展开全文
  • fragment懒加载demo

    2018-12-03 16:35:28
    fragment+viewpager+懒加载
  • Fragment懒加载看见这个标题的时候不少人都会问为何Fragment懒加载,或者在哪一种场景须要懒加载?html带着这两个疑问咱们开始往下看。java一、为何Fragment懒加载android这个缘由有点简单,就是想在用户可见的...

    Fragment懒加载看见这个标题的时候不少人都会问为何Fragment要懒加载,或者在哪一种场景须要懒加载?html

    带着这两个疑问咱们开始往下看。java

    一、为何Fragment要懒加载android

    这个缘由有点简单,就是想在用户可见的状况下Fragment才进行一系列的逻辑操做,这样减小了手机的内存开销。网络

    二、那种场景须要Fragment要懒加载app

    这个能够说本文中的重点了,就是ViewPager+Fragment联合使用的时候。有时候在ViewPager的第一页有不少网络请求,第二页也仍是有不少网络请求。而ViewPager默认状况(自定义ViewPager不在我说的范围内)是进行预加载一页的,意思就是ViewPager的第一页和第二页的网络请求都是同时发起的,这种状况下咱们手机的内存消耗也多,而网络很差的时候用户体验也不要,因而就想到了Fragment懒加载。ide

    上代码(其实很简单的):布局

    import android.os.Bundle;

    import android.support.annotation.IdRes;

    import android.support.annotation.Nullable;

    import android.support.v4.app.Fragment;

    import android.view.LayoutInflater;

    import android.view.View;

    import android.view.ViewGroup;

    public abstract class BaseFragment extends Fragment implements View.OnClickListener {

    protected View mContentView;

    /**

    * 控件是否初始化完成

    */

    private boolean isViewCreated;

    /**

    * 数据是否已加载完毕

    */

    private boolean isLoadDataCompleted;

    @Nullable

    @Override

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    this.mContentView = inflater.inflate(loadLayoutId(), null);

    initViews();

    bindListener();

    isViewCreated = true;

    return mContentView;

    }

    @Override

    public void setUserVisibleHint(boolean isVisibleToUser) {

    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser && isViewCreated)//只有在用户可见以及初始化以后才加载数据

    lazyLoad();

    }

    /**

    * Framgnet重组时候也会跳过onCreate,而onAttach和onActivityCreated仍是会被调用

    */

    @Override

    public void onActivityCreated(@Nullable Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    if (getUserVisibleHint())

    lazyLoad();

    }

    /**

    * 懒加载的方法

    */

    protected void lazyLoad() {

    if (!isLoadDataCompleted) {

    initData();

    processLogic();

    isLoadDataCompleted = true;

    }

    }

    /**

    * 为Fragment加载布局

    */

    protected abstract int loadLayoutId();

    /**

    * 初始化控件

    */

    protected abstract void initViews();

    /**

    * 初始化数

    */

    protected abstract void initData();

    /**

    * 为控件设置监

    */

    protected void bindListener() {

    }

    /**

    * 逻辑操做,网络请求

    */

    protected void processLogic() {

    }

    protected T $(@IdRes int viewId) {

    return (T) mContentView.findViewById(viewId);

    }

    protected void bindClickListener(View... views) {

    for (View view : views) {

    if (view != null)

    view.setOnClickListener(this);

    }

    }

    /**

    * 控件点击回调

    */

    protected void onClick(View view, int id) {

    }

    @Override

    public void onClick(View v) {

    onClick(v, v.getId());

    }

    @Override

    public void onDestroyView() {

    isLoadDataCompleted = false;//这里须要重置状态,否则加载了以后就没办法再从新加载了

    super.onDestroyView();

    }

    }

    看到这里,Fragment懒加载也基本结束了,可能我阐述得不是很清楚,你们能够看看其余大神们的博客什么的。this

    ViewPager+Fragment取消预加载(延迟加载).net

    Fragment要懒加载

    展开全文
  • fragment 加载 viewpager 取消预加载

    千次阅读 2016-02-29 13:37:16
    ViewPager在设计的时候有一个预加载的机制,也就是如果你处于当前这个page界面时,会预先加载下一个page。但是有的时候设计到网络请求,就需要取消掉这个预加载。 setOffscreenPageLimit()这一个方法是设置预加载的...

    ViewPager在设计的时候有一个预加载的机制,也就是如果你处于当前这个page界面时,会预先加载下一个page。但是有的时候设计到网络请求,就需要取消掉这个预加载。
    setOffscreenPageLimit()这一个方法是设置预加载的个数,默认为1,但是当你设置为0的时候也会强行将它设置为1。
    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();
    }
    }

    所以说,第一种取消预加载的方法就出来了,那就是需要更改这个DEFAULT_OFFSCREEN_PAGES = 0,但是需要更改jar包,特别麻烦,所以接下来就用一下第二种方法

    从官方的API文档来看,Fragment中有一个方法,这个方法是执行在onCreateView()方法之前的,叫做setUserVisibleHint()。用来告诉系统这个UI是否可见。

    Set a hint to the system about whether this fragment’s UI is currently visible to the user. This hint defaults to true and is persistent across fragment instance state save and restore.
    An app may set this to false to indicate that the fragment’s UI is scrolled out of visibility or is otherwise not directly visible to the user. This may be used by the system to prioritize operations such as fragment lifecycle updates or loader ordering behavior.
    Parameters
    isVisibleToUser true if this fragment’s UI is currently visible to the user (default), false if it is not.

    所以第二种方法就是重写这个setUserVisibleHint
    首先,创建一个父类,以后的Fragment都继承自MyFragment,在其中定义一个抽象方法,在子类中实现延迟加载的逻辑。

    public abstract class MyFragment extends Fragment {

    protected boolean isVisible;
    
    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (getUserVisibleHint()) {
            isVisible = true;
            delayLoad();
        } else {
            isVisible = false;
        }
    }
    
    protected abstract void delayLoad();
    

    }

    下面的就是在子类中如何实现延迟加载,同时还引入了布局的复用,因为每次切换都会产生View的重绘,浪费资源

    private boolean isReady = false;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
        if (rootView == null) {
    
            rootView = inflater.inflate(R.layout.viewpager_printpage, container, false);
            isReady = true;
            delayLoad();
            Log.d("info", "onCreateView");
        } else {
            Log.d("info", "rootView != null");
        }
    
        // Cache rootView.
        // remove rootView from its parent
        ViewGroup parent = (ViewGroup) rootView.getParent();
        if (parent != null) {
            parent.removeView(rootView);
        }
        return rootView;
    }
    
    @Override
    protected void delayLoad() {
        if (!isReady || !isVisible) {
            return;
        }
    
        // This is a random widget, it will be instantiation in init()
        if (myViewPager_Printpage == null) {
            init();
        }
    }
    
    展开全文
  • viewPager fragment 懒加载

    2017-06-30 16:00:13
    预加载无法真正的解决,我们只能做到加载,加载即在fragment可视化的时候去加载需要的数据。而使用加载的时候需注意setUserVisibleHint方法,此方法只有fragment可视化的时候,才会调用。 setUserVisibleHint...
  • Fragment 懒加载

    2018-05-31 19:43:33
    在很多 App 都会有 ViewPage + Fragment 的基本组合,但是众所周知 viewPager 的 预加载机制,即使设置函数 setOffscreenPageLimit(0)也不能改变默认值为 1 的事实,这样最少也会加载 3 个fragment,无疑对 app 的...
  • fragment预加载 加载 viewpager有着预加载机制:默认一次加载当前页面前后两个页面,即使设置setOffLimit(0)也没有效果。 虽然预加载优化了app的体验效果,但是这样把我们看不到的页面的数据也加载了,大大降低了...
  • Android Fragment预加载加载问题

    千次阅读 2017-07-26 17:20:53
    Fragment预加载:当ViewPager+Fragment...Fragment懒加载:为解决Fragment预加载导致性能降低出现的方法。 Fragment懒加载包括两种方式: 1、禁止Fragment预加载,重写ViewPager,但是这种方式会导致滑动卡顿,影响用
  • #ViewPager加载与Fragment懒加载 ##什么是加载 加载是说白了就是延迟加载,对于数据和UI就是在需要的时候再加载...再此也说一下预加载的概念,预加载就是在当前并不需要之后的某个时间需要的加载模式,常用...
  • fragment 加载和预加载的处理,有两个demo 都可以实现加在以及取消预加载
  • Android中ViewPager+Fragment懒加载问题解决方案Android中ViewPager+Fragment取消(禁止)预加载延迟加载(加载)问题解决方案
  • Fragment懒加载详解

    千次阅读 2016-12-05 14:49:46
    当然这个并不是绝对的,如果你是加载一些文本的情况下,我不建议使用加载,谷歌默认会为你预加载前后两页是有一定道理的,这样用户不会因为请求网络而导致延时的情况,而且保存之后,用户在短时间断网的情况下是有...
  • ViewPager+Fragment 组合的预加载加载 转载自http://www.crocutax.com 预加载介绍 ViewPager+Fragment的搭配在日常开发中也比较常见,可用于切换展示不同类别的页面,我们日常所见的咨询、购物、金融、...
  • Android Fragment 懒加载

    2018-02-27 15:44:27
    Android Fragment 加载 LazyLoaderFragment 源码地址 效果图: ...ViewPager 的...会预加载第二个。使用加载只有在当前fragment显示的时候才会加载 setUserVisibleHint(boolean isVisibleToUser) ...
  • 转载:https://www.jianshu.com/p/7a47907f49c2
  • 这个挺不错的,转自 http://blog.csdn.net/wangxw725/article/details/55001633 ViewPager+Fragment组合的预加载加载
  • 我们知道,在viewpage中加载多个fragment默认会预加载1项数据。而当左右滑动切换时,如果加载的fragment过多,前面已经加载的fragment界面是会被回收的。这就造成返回的时候我们又重新创建了一个fragment对象。在...
  • 文章目录前言为什么要对Fragment做延迟加载?延时加载的方法1.setUserVisibleHint2.onHiddenChanged3.setMaxLifecycle1....Fragment懒加载是android开发中一个常见的问题,网上也有很多关于懒加载的文章,而我写这篇博
  • * Fragment预加载问题的解决方案: * 1.可以加载的Fragment * 2.切换到其他页面时停止加载数据(可选) */ public abstract class LazyLoadFragment extends BaseNetFragment { /** * 视图是否已经初...
  • fragment懒加载

    2016-12-13 16:50:18
    项目之中,我们经常会使用到Viewpager+Fragment的组合应用,来实现页面的滑动,但是经常会遇到fragment预加载的问题,既viewpager会默认的加载当前页面左边或者右边的页面,如此一来,好几个fragment同时加载布局,加载...
  • 加载介绍所谓的加载,其实也就是延迟加载,就是等到该页面的UI展示给用户时,再加载该页面的数据(从网络、数据库等),而不是依靠ViewPager预加载机制提前加载两三个,甚至更多页面的数据.这样可以提高所属Activity的...
  • 但是,假如ViewPager的每一个Fragment都需要通过网络拉去数据加载,而ViewPager是默认加载前两项的,所以在很容易造成网络丢包或者网络堵塞等问题,所以Fragment使用懒加载是非常有必要的。通俗点说,当使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,400
精华内容 2,560
关键字:

fragment懒加载预加载