Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源。有可能会导致卡顿。
就需要用到Fragment里的setUserVisibleHint这个方法里。
解决办法
package com.xgs.panku.ui; import android.app.Fragment; /** * 类描述:当切换到这个fragment的时候初始化控件 * 作者:@zyx * 时间:2016/8/22 11:10 * 邮箱:[email protected] */public abstract class BaseFragment 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(); } } /** * fragment被设置为可见时调用 */ protected void onVisible(){ isLoading(); } /** * fragment被设置为不可见时调用 */ protected void onInvisible(){} //获取数据的抽象方法 protected abstract void isLoading();}调用方式:
- // 判断是否加载
- 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 isLoading() {
- if(!isPrepared || !isVisible) {
- return;
- }
- //填充各控件的数据
- }
时间: 2024-10-12 13:06:41