什么是ViewPager
ViewPager是v4包中的一个类,继承自ViewGroup,是一个容器。
ViewPager布局管理器允许翻转带数据的页面,可以通过实现PagerAdapter来显示视图。
ViewPager经常用来连接Fragment,它能够方便的管理每个页面的生命周期,ViewPager通过适配器管理Fragment,常用的适配器有FragmentPagerAdapter和FragmentStatePagerAdapter。
一、布局中添加控件
使用场景:recycleview中嵌套viewpager,这里自定义viewpger,实现滑动事件焦点问题。viewpger到最后一页将焦点交出
<com.test.demo.view.customview.OutScrollViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="260dp"
android:layout_marginTop="20dp" />
二、布局中调用
ViewPager viewPager = helper.getView(R.id.viewpager);
三、自定义adapter
public class SectionsPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragments;
public SectionsPagerAdapter(@NonNull FragmentManager fm, List<Fragment> fragments) {
super(fm);
this.fragments = fragments;
}
public SectionsPagerAdapter(@NonNull FragmentManager fm) {
super(fm);
}
public void setData(List<Fragment> fragments) {
this.fragments = fragments;
notifyDataSetChanged();
}
@NonNull
@Override
public Fragment getItem(int position) {
if (fragments != null) {
return fragments.get(position);
} else {
return new Fragment();
}
}
@Override
public int getCount() {
if (fragments != null) {
return fragments.size();
} else {
return 0;
}
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
}
四、设置适配器
-
getSupportFragmentManager():
v4包中的Fragment可以通过getSupportFragmentManager()方法获得;
getSupportFragmentManager()主要用于支持 3.0以下android系统API版本, -
getFragmentManager()
Android自带的Fragment可以通过getFragmentManager()方法获得。
3.0以上系统可以直接调用getFragmentManager() -
getChildFragmentManager()
Fragment嵌套Fragment要用getChildFragmentManager().
getChildFragmentManager() 所得到的是在 fragment 里面子容器的管理器。
//1.如果所有ViewPager不显示,RecyclerView的item必须要个高度,所以要给Viewpager设置一个固定高度
//2.如果只有第一项显示,其他项的viewpager不显示, ViewPager在同一个页面中,不允许存在相同的id,需要给不同的viewpager设置不同的ID,不要设置为0,否则会不显示
viewPager.setId(helper.getAdapterPosition() + 1);
//adapter中的复用
if (viewPager.getAdapter() == null) {
SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(childFragmentManager);
viewPager.setAdapter(sectionsPagerAdapter);
}
((SectionsPagerAdapter) viewPager.getAdapter()).setData(fragmentList);
五、自定义的viewpager,recycleview嵌套viewpager滑动事件处理
viewpager由右向左滑动到最后一项,父容器拦截响应事件
viewpager由左向右滑动到第一条,父容器拦截响应事件
public class OutScrollViewPager extends ViewPager {
public OutScrollViewPager(@NonNull Context context) {
super(context);
}
public OutScrollViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
// 用于标记滑动的坐标
private int downX = 0;
private int downY = 0;
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN: {
downX = x;
downY = y;
getParent().requestDisallowInterceptTouchEvent(true);
break;
}
case MotionEvent.ACTION_MOVE: {
int deltaX = x - downX;
int deltaY = y - downY;
//左右滑动
if(Math.abs(deltaX) < Math.abs(deltaY)){
getParent().requestDisallowInterceptTouchEvent(true);
}else {
if (deltaX < 0) {
//由右向左移动,最后一个点,翻转整个模块
if (getCurrentItem() == getAdapter().getCount() - 1) {
getParent().requestDisallowInterceptTouchEvent(false);//让viewpager告知其父容器要拦截响应事件
} else if (getCurrentItem() < getAdapter().getCount() - 1) {
getParent().requestDisallowInterceptTouchEvent(true);//让viewpager告知其父容器不要拦截响应事件
}
} else {
//由左向右移动,第一个点,翻转整个模块
if (getCurrentItem() == 0) {
getParent().requestDisallowInterceptTouchEvent(false);//让viewpager告知其父容器要拦截响应事件
} else if (getCurrentItem() > 0) {
getParent().requestDisallowInterceptTouchEvent(true);//让viewpager告知其父容器不要拦截响应事件
}
}
}
break;
}
case MotionEvent.ACTION_UP: {
getParent().requestDisallowInterceptTouchEvent(false);
break;
}
}
//赋值
return super.dispatchTouchEvent(ev);
}
}