一次滑动一项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居中效果