RecyclerView循环滚动,无限滚动

RecyclerView 实现背景 或者 item 循环滚动,无限滚动
先看效果:
在这里插入图片描述
之后有时间了,再上传一下,自定义imageview 实现大图长图循环滚动的view;

自动滚动实现方法:首先自定义LinearLayoutManager,重写smoothScrollToPosition方法,然后实现个自己的LinearSmoothScroller ,在calculateSpeedPerPixel返回个自定义的速率值。看过源码就会很容易理解,这里就不上源码了,可以自行搜索一下,循环滚动的话adapter里 getItemCount() 返回集合size,如果是一个方法无限滚动下去,就返回 Integer.MAX_VALUE;代码里
recyclerView.smoothScrollToPosition(Integer.MAX_VALUE / 2);就不需要监听滚动了。

代码如下:

public class CustomLinerLayoutManager extends LinearLayoutManager {
    private float speedPerPixel = 0.001f;//滚动速率 越小越快 越大越慢
    private Context context;

    public CustomLinerLayoutManager(Context context) {
        super(context);
        this.context = context;
    }

    public CustomLinerLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    public CustomLinerLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }


    public void setSpeedPerPixel(float speedPerPixel) {
        this.speedPerPixel = speedPerPixel;
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
        RecyclerView.SmoothScroller smoothScroller = new CenterSmoothScroller(recyclerView.getContext());
        smoothScroller.setTargetPosition(position);
        startSmoothScroll(smoothScroller);
    }

    private class CenterSmoothScroller extends LinearSmoothScroller {

        CenterSmoothScroller(Context context) {
            super(context);
        }

        @Nullable
        @Override //滑动到目标索引
        public PointF computeScrollVectorForPosition(int targetPosition) {
            return CustomLinerLayoutManager.this.computeScrollVectorForPosition(targetPosition);
        }

        @Override // 滑动位置
        public int calculateDtToFit(int viewStart, int viewEnd, int boxStart, int boxEnd, int snapPreference) {
            return (boxStart + (boxEnd - boxStart) / 2) - (viewStart + (viewEnd - viewStart) / 2);
        }

        protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {// 控制滑动速度的
            return speedPerPixel;
        }

        @Override
        protected int getVerticalSnapPreference() {
            return SNAP_TO_START;
        }
    }

    public void setSpeedSlow() {
        speedPerPixel = context.getResources().getDisplayMetrics().density * 3f;
    }

    public void setSpeedFast() {
        speedPerPixel = context.getResources().getDisplayMetrics().density * 0.03f;
    }
}

RecyclerView 添加 OnScrollListener 监听,滑动过程中,监听当前的索引位置 或者 在顶部或者是在底部,方法很多,可以参考实现 或者自行是实现,在底部了就让它往顶部滚动,在顶部了就让它往底部滚动,速率大小可以通过CustomLinerLayoutManager 自定义 ,写个方法外部set 进去也可以。

 RecyclerView.OnScrollListener onScrollListenerTwo = new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            isVisBottom(recyclerView);
        }
    };

    public void isVisBottom(RecyclerView recyclerView) {
        LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        if (!recyclerView.canScrollHorizontally(-1)) {//当前在顶部
            recyclerView.smoothScrollToPosition(linearLayoutManager.getItemCount() - 1);
        }
        if (!recyclerView.canScrollHorizontally(1)) {//当前在底部
            recyclerView.smoothScrollToPosition(0);
        }
    }
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RecyclerView是一个强大的Android视图组件,它可以用于展示大量的数据列表。然而,默认情况下,RecyclerView是不支持循环滚动的,即当滚动到列表末尾时,无法自动回到列表开头进行循环。 如果我们想要实现RecyclerView循环滚动,可以采取以下步骤: 1. 添加循环滚动的功能,可以选择使用RecyclerView的扩展类,例如LoopRecyclerView,它继承自RecyclerView。 2. 在自定义的LoopRecyclerView中,我们可以通过重写LayoutManager的`scrollToPosition()`方法和`onLayoutCompleted()`方法来实现循环滚动的效果。 3. 在`scrollToPosition()`方法中,我们需要判断滚动到列表末尾时,将滚动位置设置为列表的开头。具体操作是,当滚动到列表末尾时,我们可以通过调用RecyclerView的`getAdapter().getItemCount()`方法获取到列表的总数,然后将滚动位置设置为0,即列表的开头。 4. 在`onLayoutCompleted()`方法中,我们需要监听列表的布局完成事件,在布局完成时判断列表是否滚动到了末尾,如果滚动到了末尾,同样将滚动位置设置为列表的开头,实现循环滚动的效果。 5. 使用我们自定义的LoopRecyclerView替换原来的RecyclerView,并设置相应的适配器和布局管理器,即可实现循环滚动RecyclerView。 总之,通过继承RecyclerView和重写LayoutManager的相关方法,我们可以实现RecyclerView循环滚动。这样,当用户滚动到列表末尾时,列表会自动回到开头,实现循环滚动的效果。 ### 回答2: RecyclerView默认是不支持循环滚动的,但可以通过一些方法实现循环滚动效果。 首先,可以创建一个自定义的LayoutManager来实现循环滚动。可以继承LinearLayoutManager或GridLayoutManager,并重写onLayoutChildren()方法来改变布局行为。在onLayoutChildren()方法中,可以通过设置setStackFromEnd(true)来将最后一个item放在顶部,并使用setReverseLayout(true)来反向布局。 其次,需要监听RecyclerView滚动事件。可以通过addOnScrollListener()方法添加一个滚动监听器,然后在监听器的回调方法中判断当前滚动位置,当滚动到第一个或最后一个item时,通过调用scrollToPosition()方法平滑地滚动到相应的位置。 最后,可以创建一个无限循环的数据源来使RecyclerView实现循环滚动。在Adapter中,可以使用getItemCount()方法返回一个较大的值,然后在getItemViewType()方法中使用求模运算根据位置返回实际的数据项。 总结起来,实现RecyclerView循环滚动的关键步骤包括创建自定义LayoutManager、监听滚动事件、以及创建无限循环的数据源。这样就可以让RecyclerView实现类似ViewPager一样的循环滚动效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值