ViewPager+Fragment懒加载

来源:互联网 发布:一元云购v8源码 编辑:程序博客网 时间:2024/05/22 17:19

要想实现Fragment的懒加载首先介绍两个方法:

void setUserVisibleHint(boolean isVisibleToUser)

boolean getUserVisibleHint()

它们分别用作设置/获得Fragment可见状态,我们可以重写Fragment在其中做判断.

public class MyFragment extends Fragment {      private boolean isInit; // 是否可以开始加载数据        @Override      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {          isInit = true;          return inflater.inflate(R.layout.fragment_my, container, false);      }        @Override      public void onViewCreated(View view, Bundle savedInstanceState) {          super.onViewCreated(view, savedInstanceState);          /* 初始化控件 */      }        @Override      public void onResume() {          super.onResume();          // 判断当前fragment是否显示          if (getUserVisibleHint()) {              initViewAndData ();  </span>        }      }        @Override      public void setUserVisibleHint(boolean isVisibleToUser) {          super.setUserVisibleHint(isVisibleToUser);          // 每次切换fragment时调用的方法          if (isVisibleToUser) {             initViewAndData();          }      }        /**      * 初始化数据      */      private void initViewAndData() {          if (isInit) {              isInit = false;//加载数据完成              // 加载各种数据          }      }  }   

一般情况下ViewPager与fragment配合使用肯定不止一个fragment,每个fragment都这样不累死。。。不会偷懒的程序猿都不是好猿。

抽取一个BaseFragment出来

public abstract class BaseFragment extends Fragment {    protected View rootView = null;    protected TextView tv_title;    protected EditText et_home_search;    /**     * 是否开始加载     */    protected  boolean isLoad=false;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        isLoad=true;return super.onCreateView(inflater, container, savedInstanceState);    }    @Override    public void onViewCreated(View view, Bundle savedInstanceState) {        super.onViewCreated(view, savedInstanceState);    }    @Override    public void onResume() {        super.onResume();        /**         * 判断当前fragment是否显示         */        if(getUserVisibleHint()){            initViewAndData();        }    }    /**     * 初始化布局以及数据     */    public abstract void initViewAndData();    @Override    public void setUserVisibleHint(boolean isVisibleToUser) {        super.setUserVisibleHint(isVisibleToUser);        /**         * 每次切换fragment时调用的方法         */        if(isLoad){            initViewAndData();        }    }}
使用的时候直接继承BaseFragment,这里需要注意的是重写了initViewAndData()方法后记得判断一下.

 private void initViewAndData() {          if (isInit) {              isInit = false;//加载数据完成              // 加载各种数据          }      }  






1 0
原创粉丝点击