一次只滑动一个项目的Recyclerview

38

我尝试为 RecyclerView 添加滚动监听器并编写了一些逻辑,但我无法每次只滑动一个项目。我在互联网上进行了一些搜索,但我得到了一些具有自定义 RecyclerView 的第三方库。我们可以在 RecyclerView 中实现每次滑动一个项目吗?如果可以,请告诉我如何操作? 像这样每次只滑动一个项目 image


1
Viewpager就是你要找的。至于自定义转场,请参考这个链接 - Udit Mukherjee
谢谢。但是我不能使用ViewPager来滚动RecyclerView中的一个项目。 - anon
嗯,我的意思是使用Viewpager而不是RecyclerView。 - Udit Mukherjee
有没有其他不使用ViewPager的方法? - anon
重复的问题。 请参考此链接 - Kshitij Jain
你好 @AkshayBhat'AB',能否帮我解决这个问题 https://dev59.com/oqrka4cB1Zd3GeqPjMuw?noredirect=1#comment87836903_49952965?谢谢。 - user9550968
3个回答

42

这使得项目之间的移动更加平滑:

public class SnapHelperOneByOne extends LinearSnapHelper {

    @Override
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {

        if (!(layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
            return RecyclerView.NO_POSITION;
        }

        final View currentView = findSnapView(layoutManager);

        if (currentView == null) {
            return RecyclerView.NO_POSITION;
        }

        LinearLayoutManager myLayoutManager = (LinearLayoutManager) layoutManager;

        int position1 = myLayoutManager.findFirstVisibleItemPosition();
        int position2 = myLayoutManager.findLastVisibleItemPosition();

        int currentPosition = layoutManager.getPosition(currentView);

        if (velocityX > 400) {
            currentPosition = position2;
        } else if (velocityX < 400) {
            currentPosition = position1;
        }

        if (currentPosition == RecyclerView.NO_POSITION) {
            return RecyclerView.NO_POSITION;
        }

        return currentPosition;
    }
}

例子:

LinearSnapHelper linearSnapHelper = new SnapHelperOneByOne();
linearSnapHelper.attachToRecyclerView(recyclerView);

你是天才兄弟,谢谢。 - ParSa
为什么需要常量?400 - user924
1
很好,但在垂直滚动的情况下,将velocityX替换为velocityY对我有效。如果使用400进行检查,则滚动速度低于更多以进行向上或向下滚动的检查。 - Amar Singh
谢谢,很完美。 - Skovie
有没有办法让切换到另一个项目更快一些,因为当前的形式感觉非常慢? - tycoon
显示剩余2条评论

33

我知道,这有点晚了。

使用自定义的SnapHelper可以非常简单地实现所需的滚动行为。

通过覆盖标准的SnapHelper(android.support.v7.widget.LinearSnapHelper),创建您自己的SnapHelper。

public class SnapHelperOneByOne extends LinearSnapHelper{

    @Override
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY){

        if (!(layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
            return RecyclerView.NO_POSITION;
        }

        final View currentView = findSnapView(layoutManager);

        if( currentView == null ){
            return RecyclerView.NO_POSITION;
        }

        final int currentPosition = layoutManager.getPosition(currentView);

        if (currentPosition == RecyclerView.NO_POSITION) {
            return RecyclerView.NO_POSITION;
        }

        return currentPosition;
    }
}

这基本上是标准方法,但没有添加一个由滚动速度计算的跳转计数器。

如果您快速且长时间地滑动,则下一个(或上一个)视图将居中显示。

如果您缓慢而短暂地滑动,则当前居中的视图在释放后仍保持居中。

我希望这个答案仍然可以帮助任何人。


谢谢!你的回答救了我的一天。 - Hoby
4
有没有办法增加滑动的速度?它能够进行滑动,但需要完整的滑动才能滚动到下一个项目。 - Dheeraj Rijhwani
你有找到任何提高滑动速度的方法吗? - Rahul Khurana
滚动不流畅。 - Amar Singh
6
请使用新的 PagerSnapHelper() 代替 LinearSnapHelper() - Bilal Kazi
显示剩余3条评论

2

这里有一个类似于您在图像中展示的东西的链接。如果您需要其他内容,请告诉我,我会提供相关的库链接。

基本上ViewPager和recyclerView之间的区别在于,在recyclerView中您可以在多个项目之间切换,而在ViewPager中您可以在多个片段或独立页面之间切换。

我看到您正在使用这个,您有任何特定的用例吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接