andorid viewPager +fragmen实现滑动多个界面,每个界面都有数据请求,但是我想让每个fragment仅第一次加载的时候请求数据,以后再滑动到这个fragment的时候都不在请求数据了(想请求可以下拉刷新),请问怎么实现?
viewpager有个setOffscreenPageLimit方法,设置缓存页面数量,你有多少个fragment就设置多少,这样fragment只创建一次,不会中途被销毁
通过fragment的生命周期进行判断,结合一些变量
可以从fragment出下手,考虑考虑,切换时将之前的fragment隐藏,不销毁,试试能不能合要求。
public abstract class BaseFragment extends Fragment {
protected Context mContext;
protected Activity mActivity;
protected LayoutInflater mInflater;
/**
* 标志位,标志已经初始化完成
*/
protected boolean isPrepared;
private View rootView;
public BaseFragment() {
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mActivity = getActivity();
this.mContext = context;
this.mInflater = LayoutInflater.from(mActivity);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(setContentViewId(), container, false);
isPrepared = true;
return rootView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initViews();
if (isFirstVisible && getUserVisibleHint()) {
onFirstVisible();
isFirstVisible = false;
onVisible();
}
}
//========================懒加载=========================
/**
* Fragment当前状态是否可见
*/
private boolean isFirstVisible = true;
private boolean isFirstInvisible = true;
//调用早于 onCreate(); 所以 判断是否已创建 view
//setUserVisibleHint()在Fragment创建时会先被调用一次,传入isVisibleToUser = false
//如果当前Fragment可见,那么setUserVisibleHint()会再次被调用一次,传入isVisibleToUser = true
//如果Fragment从可见->不可见,那么setUserVisibleHint()也会被调用,传入isVisibleToUser = false
//总结:setUserVisibleHint()除了Fragment的可见状态发生变化时会被回调外,在new Fragment()时也会被回调
// 这个方法仅仅工作在与viewpaer 配合使用的 Adapter中
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isPrepared) {
if (isFirstVisible) {
onFirstVisible();
isFirstVisible = false;
}
onVisible();
}
if (!isVisibleToUser && isPrepared) {
onInvisible();
}
}
/**
* 第一次可见,并且以初始化完成
*/
protected void onFirstVisible() {
}
/**
* 可见,并且已初始化完成
*/
protected void onVisible() {
}
public boolean isFirstVisible() {
return isFirstVisible;
}
/**
* 不可见
*/
protected void onInvisible() {
}
/**
* 初始化布局
*/
protected abstract int setContentViewId();
/**
* 初始化参数
*/
protected abstract void initViews();
}