一次滑动一项Recyclerview [重复]

Posted

技术标签:

【中文标题】一次滑动一项Recyclerview [重复]【英文标题】:Swipe one item at a time Recyclerview [duplicate] 【发布时间】:2015-11-26 07:05:30 【问题描述】:

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

【问题讨论】:

Viewpager 是您正在寻找的。至于自定义过渡,请通过this 谢谢。但我不能使用 ViewPager 滚动 Recyclerview 中的一项。 嗯,我的意思是使用 Viewpager 而不是 RecyclerView。 不使用Viewpager还有其他方法吗? 重复问题。请参考这个link。 【参考方案1】:

这软化了项目之间的移动:

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);

【讨论】:

你是天才兄弟,谢谢 为什么会有常量? 400 很好,但在垂直滚动velocityX的情况下替换为velocityY为我工作。并且 mr user924 400 用于检查然后滚动速度低于更多用于检查向上滚动或向下滚动 它真的很值得。你救了我的一天,兄弟。谢谢 如果您在 recyclerView 中使用反向布局,则在 if-else 子句中将 position2 更改为 position1。现在您将获得所需的输出。【参考方案2】:

太晚了,我知道

有一种非常简单的方法可以通过使用自定义 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;
    

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

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

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

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

【讨论】:

谢谢!你的回答拯救了我的一天 有什么方法可以提高刷卡速度。它会滑动,但需要完全滑动才能滚动到下一个项目。 你有没有找到提高滑动速度的方法? @DheerajRijhwani 你找到解决方案了吗? 使用新的PagerSnapHelper() 而不是LinearShapHelper()【参考方案3】:

https://github.com/googlesamples/android-HorizontalPaging/

这包含与您在图片中显示的内容类似的链接。如果您还需要其他内容,请告诉我,我会链接相关库。

ViewPager 和 recyclerView 的主要区别在于,在 recyclerView 中你是在许多项目之间切换,而在 ViewPager 中你是在许多片段或独立页面之间切换。

我看到你正在使用这个https://github.com/lsjwzh/RecyclerViewPager,你有什么特别的用例吗?

【讨论】:

以上是关于一次滑动一项Recyclerview [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在一个片段中检测Recyclerview的上下滑动,我怎么做?

关于Android RecyclerView滑动卡顿怎么解决

Android-RecyclerView系列 RecyclerView实现Item居中效果

Kevin Learn Recyclerview-->UltimateRecyclerView 的基本使用

RecyclerView使用大全

RecycleView4种定位滚动方式演示