Android实战开发中,当我们使用ViewPager+Fragment的时候肯定知道Fragment会预先加载两侧Fragment的布局,如果有大量数据的话,会造成Fragment卡顿现象,所以这里说明一种Fragment缓加载的方式,相当简单,只要继承以下父类Fragment,再在对应方法中加载数据即可实现Fragment缓加载了。
一:写个基础类BaseFragment(
ButterKnife.inject(this, rootView);
这个是用的注解,在gradle文件里面添加
compile 'com.jakewharton:butterknife:6.1.0' 即可
)
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import butterknife.ButterKnife;
/*用于fragment的基类*/
/**
* Created by masskywcy on 2016-07-08.
*/
public abstract class Basecfragment extends Fragment implements View.OnClickListener {
public Context mContext;
protected boolean isVisible;
private boolean isPrepared;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(viewId(), null);
ButterKnife.inject(this, rootView);
onView();
return rootView;
}
protected abstract int viewId();
protected abstract void onView();
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
lazyLoad();
} else {
isVisible = false;
onInvisible();
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Log.d("TAG", "fragment->onActivityCreated");
isPrepared = true;
lazyLoad();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getActivity();
setHasOptionsMenu(true);
// Log.d("TAG", "fragment->onCreate");
}
/**
* 懒加载
*/
protected void lazyLoad() {
if (!isPrepared || !isVisible) {
return;
}
initData();
}
public abstract void initData();
//do something
protected void onInvisible() {
}
}
二、在viewpager中实现
OnPageChangeListener 监听重写方法
@Override
public void onPageSelected(int position) {
Basecfragment fagmentbase = (Basecfragment) list.get(position);
fagmentbase.initData();
}
三、子类DemoFragment,注意在数据更新梳理写在initData()方法里面
import android.view.View;
import com.base.Basecfragment;
public class DemoFragment extends Basecfragment {
@Override
protected int viewId() {
return R.layout.布局名字;
}
@Override
protected void onView() {
}
@Override
public void initData() {
}
@Override
public void onClick(View v) {
}
}