recycleview嵌套viewpager与Fragment结合使用

什么是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;
    }
}

四、设置适配器

  1. getSupportFragmentManager():
    v4包中的Fragment可以通过getSupportFragmentManager()方法获得;
    getSupportFragmentManager()主要用于支持 3.0以下android系统API版本,

  2. getFragmentManager()
    Android自带的Fragment可以通过getFragmentManager()方法获得。
    3.0以上系统可以直接调用getFragmentManager()

  3. 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);
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值