RecyclerView卡片切换效果(翻页滚动的效果) ----- PagerSnapHelper

本文深入解析PagerSnapHelper,一种使RecyclerView具备类似ViewPager滑动效果的工具。介绍其原理,包括SnapHelper类及其实现,以及如何在项目中快速应用并监听当前页面变化。

PagerSnapHelper,官方解释,PagerSnapHelper can help achieve a similar behavior to ViewPager.,就是让RecyclerView能像ViewPager一样工作。

PageSnapHelper衍生于SnapHepler,SnapHepler是什么?从代码可以看出该组件本质上就是一个RecyclerView.OnFlingListener

public abstract class SnapHelper extends RecyclerView.OnFlingListener

SnapHepler类是个抽象类,有两个实现类LinearSnapHelperPagerSnapHelper。

使用时两行代码就能搞定了,

PagerSnapHelper pagerSnapHelper = new PagerSnapHelper();
 pagerSnapHelper.attachToRecyclerView(recyclerView);

如果想知道当前页是第几页,可以监听滚动

recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {//如果滚动结束
                    View snapView = scrollHelper.findSnapView(layoutManager);
                    if (layoutManager != null && snapView != null) {
                        int currentPageIndex = layoutManager.getPosition(snapView);
                        if (currentPostion != currentPageIndex) {//防止重复提示
                            currentPostion = currentPageIndex;
                            Logger.e("当前是第" + currentPageIndex + "页");
                        }
                    }
                }
            }

            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                /***如需要灵敏的获取到位置,可在此处进行处理*/
                View snapView = scrollHelper.findSnapView(layoutManager);
                if (layoutManager != null && snapView != null) {
                    int currentPageIndex = layoutManager.getPosition(snapView);
                    if (currentPostion != currentPageIndex) {       //防止重复提示
                        currentPostion = currentPageIndex;
                        Logger.e("当前是第" + currentPageIndex + "页");
                    }
                }
            }
        });

为了知道当前页是第几页走了一些弯路,实际中发现,从RecyclerView的postion是无法获取到准确值的。很大可能会出现当前显示的第一页(index=0),但从RecyclerView获取到的postion至少大于等于1,一直怀疑是自己的获取postion方法错误,搞的心力交瘁,这里记录一下获取RecyclerView的position的位置的方法

1、使用接口回调,回调写在onBindViewHolder方法下,回调postion的位置

2、写在ViewHolder里面,处理按钮点击事件,事件中处理postion回调

同时获取postion的方法用两个,getAdapterPosition()和getLayoutPosition

getAdapterPostion()得到的返回值为NO_POSITION(-1),在使用这个结果的时候,可能需要做异常处理,否则可能会出现ArrayIndexOutOfBoundsException的异常。
通过getLayoutPosition()获取的位置信息,是更新布局之前的位置信息,所以通过getLayoutPosition获取的结果有可能是脏数据。

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值