以前做法
package cool.hyz.xujiayi.base;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
public abstract class BaseFragment extends Fragment {
public static final String TAG = "BaseFragment";
protected boolean isInit = false;
protected boolean isLoad = false;
private View mView;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mView = onSubViewLoaded(inflater, container);
isInit = true;
isCanLoadData();
return mView;
}
private void isCanLoadData() {
if (!isInit) return;
Log.d(TAG, "isCanLoadData: "+getUserVisibleHint());
if (getUserVisibleHint()&&!isLoad) {
lazyLoadData();
isLoad = true;
} else {
if (isLoad) stopLoadData();
}
}
public abstract View createSuccess(LayoutInflater inflater, ViewGroup container);
protected abstract void lazyLoadData();
protected void stopLoadData() {
}
protected abstract View onSubViewLoaded(LayoutInflater inflater, ViewGroup container);
@Override
public void onDestroyView() {
super.onDestroyView();
isInit = false;
isLoad = false;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
isCanLoadData();
}
}
java
package cool.hyz.xujiayi.views.home;
import android.content.Intent;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
import cool.hyz.xujiayi.R;
import cool.hyz.xujiayi.base.BaseFragment;
public class HomeFragment extends BaseFragment {
public static final String TAG = "HomeFragment";
private Banner mBannerH;
private Banner mBannerV;
private View mRoot;
public HomeFragment() {
}
@Override
protected void lazyLoadData() {
Log.d(TAG, "lazyLoadData: HomeView load data...");
}
@Override
protected View onSubViewLoaded(LayoutInflater inflater, ViewGroup container) {
mRoot = inflater.inflate(R.layout.fragment_home, container, false);
return mRoot ;
}
@Override
protected void stopLoad() {
Log.d(TAG, "HomeFragment" + "已经对用户不可见,可以停止加载数据");
}
}
java
问题
getUserVisibleHint()
Deprecated;
setUserVisibleHint(boolean)
Deprecated;
新做法
- 使用
FragmentPagerAdapter
时直接使用两个参数的构造方法FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
package cool.hyz.xujiayi.adapters;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import cool.hyz.xujiayi.creators.FragmentCreator;
public class FragPagerAdapter extends FragmentPagerAdapter {
public FragPagerAdapter(@NonNull FragmentManager fm) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}
@NonNull
@Override
public Fragment getItem(int position) {
return FragmentCreator.getFragment(position);
}
@Override
public int getCount() {
return FragmentCreator.PAGE_COUNT;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
}
}
java
原理
- 通过
FragmentTransaction
的setMaxLifecycle()
方法——替代setUserVisibleHint()
方法实现Fragment
的懒加载效果。
instantiateItem()
中setMaxLifecycle()
设置的Fragment
状态为STARTED
,即通过ViewPager.offscreenPageLimit
设置提前初始化时,临近的Fragment
最多执行到onStart()
方法,不会再执行onResume()
方法了
- 如果需要
Fragment
只执行一次对应逻辑且Fragment
重新加载View
时需要重置,之前通常会通过setUserVisibleHint(isVisibleToUser: Boolean)
里通过isVisibleToUser
以及自定义的isLoaded
去判断,现在可以直接将逻辑写到onResume
中:
...
public class HomeFragment extends BaseFragment {
public static final String TAG = "HomeFragment";
...
private boolean isLoaded = false;
@Override
public void onResume() {
super.onResume();
if(!isLoaded){
...
isLoaded = true;
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
isLoaded = false;
}
}
java
参考文章
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
- Fragment.setUserVisibleHint()懒加载过时问题优化