7、viewpager2

①、setUserVisibleHint已过时 setMaxLifecycle代替

②、 RecyclerView中的缓存机制 来处理 “缓存页面”

基于RecyclerView实现。这意味着RecyclerView的优点将会被ViewPager2所继承。

支持竖直滑动。只需要一个参数就可以改变滑动方向。

支持关闭用户输入。通过setUserInputEnabled来设置是否禁止用户滑动页面。

FragmentStatePagerAdapter 被 FragmentStateAdapter 替代addPageChangeListener 被 registerOnPageChangeCallback替代

-----------------------------------------------------------------------------------------------------

内容:优化fragment处理懒加载的代码 基于viewpager1

public abstract class LazyFragment5extends Fragment {

FragmentDelegatermFragmentDelegater;

private ViewrootView =null;

private boolean isViewCreated =false; // View加载了

private boolean isVisibleStateUP =false; // 记录上一次可见的状态

@Nullable

@Override

public ViewonCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

E("onCreateView: ");

if (rootView ==null) {

rootView = inflater.inflate(getLayoutRes(),container, false);

}

isViewCreated  =true; // 解决奔溃1.1

initView(rootView); // 初始化控件 findvxxx

// 解决第一次一直初始化loading一直显示的问题 【第二版2.1】

if (getUserVisibleHint()) {

// 手动来分发下

setUserVisibleHint(true);

}

return rootView;

}

// 判断 Fragment 是否可见 【第一版 1.1】

@Override

public void setUserVisibleHint(boolean isVisibleToUser) {

super.setUserVisibleHint(isVisibleToUser);

E("setUserVisibleHint");

if (isViewCreated) {

// 记录上一次可见的状态: && isVisibleStateUP

if (isVisibleToUser && !isVisibleStateUP) {

dispatchUserVisibleHint(true);

}else if (!isVisibleToUser &&isVisibleStateUP){

dispatchUserVisibleHint(false);

}

}

}

// 分发 可见 不可见 的动作 【第一版 1.2】

private void dispatchUserVisibleHint(boolean visibleState) {

// 记录上一次可见的状态 实时更新状态

this.isVisibleStateUP = visibleState;

// TODO 为了解决第一个问题

if (visibleState && isParentInvisible()) {

return;

}

if (visibleState) {

// 加载数据

onFragmentLoad();  // 都是对第一层有效,嵌套无效

// TODO 为了解决第二个问题,T1 到 T2 T2里面嵌套的ViewPager的Fragment默认不会分发执行

// 手动 嵌套 分发执行

// TODO 为了解决第二个问题,T1 到 T2 T2里面嵌套的ViewPager的Fragment默认不会分发执行

// 在双重ViewPager嵌套的情况下,第一次滑到Frgment 嵌套ViewPager(fragment)的场景的时候

// 此时只会加载外层Fragment的数据,而不会加载内嵌viewPager中的fragment的数据,因此,我们

// 需要在此增加一个当外层Fragment可见的时候,分发可见事件给自己内嵌的所有Fragment显示

dispatchChildVisibleState(true);

}else {

// 停止一切操作

onFragmentLoadStop();  // 都是对第一层有效,嵌套无

// TODO 为了解决第二个问题,T1 到 T2 T2里面嵌套的ViewPager的Fragment默认不会分发执行

dispatchChildVisibleState(false);

}

}

// TODO 为了解决第二个问题,T1 到 T2 T2里面嵌套的ViewPager的Fragment默认不会分发执行

//  解决:需要手动的分发执行嵌套Fragment里面的

protected void dispatchChildVisibleState(boolean state) {

FragmentManager fragmentManager = getChildFragmentManager();

List fragments = fragmentManager.getFragments();

if (fragments !=null) {

for (Fragment fragment: fragments) {// 循环遍历 嵌套里面的 子 Fragment 来分发事件操作

if (fragmentinstanceof LazyFragment5 &&

!fragment.isHidden() &&

fragment.getUserVisibleHint()) {

((LazyFragment5)fragment).dispatchUserVisibleHint(state);

}

}

}

}

// TODO 判断 父控件 是否可见, 什么意思? 例如:  Fragment2_vp1子Fragment  的  父亲/父控件==Fragment2

private boolean isParentInvisible() {

Fragment parentFragment = getParentFragment();

if (parentFragmentinstanceof LazyFragment5) {

LazyFragment5 fragment = (LazyFragment5) parentFragment;

return !fragment.isVisibleStateUP;

}

return false;

}

// 让子类完成,初始化布局,初始化控件

protected abstract void initView(View rootView);

protected abstract int getLayoutRes();

// -->>>停止网络数据请求

public void onFragmentLoadStop() {

E("onFragmentLoadStop");

}

// -->>>加载网络数据请求

public void onFragmentLoad() {

E("onFragmentLoad");

}

@Override

public void onResume() {

super.onResume();

E("onResume")

// 不可见 到 可见 变化过程  说明可见

if (getUserVisibleHint() && !isVisibleStateUP) {

dispatchUserVisibleHint(true);

}

}

@Override

public void onPause() {

super.onPause();

E("onPause");

// 可见 到 不可见  变化过程  说明 不可见

if (getUserVisibleHint() &&isVisibleStateUP) {

dispatchUserVisibleHint(false);

}

}

@Override

public void onDestroyView() {

super.onDestroyView();

E("onDestroyView");

}

// 工具相关而已

public void setFragmentDelegater(FragmentDelegater fragmentDelegater) {

mFragmentDelegater = fragmentDelegater;

}

private void E(String  string) {

if (mFragmentDelegater !=null) {

mFragmentDelegater.dumpLifeCycle(string);

}

}

}