1.第一层viewpager设置不能预加载(自定义viewpager修改其DEFAULT_OFFSCREEN_PAGES=0)
2.tablayout和viewpager关联之后,tag和fragment没有对应上,tag感觉变多了。(子viewpager的adapter需要使用fragment.childFragmentManager)
3.子ViewPager滑到第一页或是最后一页的时候继续滑动不会触发父ViewPager的滑动
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;
import androidx.viewpager2.widget.ViewPager2;
import com.loyo.commonlibrary.utils.ToastUtil;
/**
* 解决嵌套ViewPager的滑动冲突
* 子ViewPager滑到第一页或是最后一页的时候继续滑动不会触发父ViewPager的滑动
*/
public class ChildViewPager extends ViewPager {
public ChildViewPager(@NonNull Context context) {
super(context);
}
public ChildViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
private float x1;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
//告知父控件 把事件下发给子控件处理
getParent().requestDisallowInterceptTouchEvent(true);
x1 = ev.getX();
break;
case MotionEvent.ACTION_MOVE:
//拿到当前显示页下标
int curPosition = getCurrentItem();
//手指移动时的X坐标
float x2 = ev.getX();
if (curPosition == 0) {
if ((x2 - x1) > 50) {
//当当前页面在下标为0的时候,由父亲拦截触摸事件
// getParent().requestDisallowInterceptTouchEvent(false);
} else {
getParent().requestDisallowInterceptTouchEvent(true);
}
} else if (curPosition == (getAdapter().getCount() - 1)) { //当前页面为最后一页时
if ((x1 - x2) > 50) {
// getParent().requestDisallowInterceptTouchEvent(false);
} else {
getParent().requestDisallowInterceptTouchEvent(true);
}
} else {
//其他情况,由孩子拦截触摸事件
getParent().requestDisallowInterceptTouchEvent(true);
}
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(ev);
}
}
4.禁止第三层viewpager滑动切换
public class ChildNoScrollViewPager extends ViewPager {
public ChildNoScrollViewPager(@NonNull Context context) {
super(context);
}
public ChildNoScrollViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
}