我尝试为 RecyclerView 添加滚动监听器并编写了一些逻辑,但我无法每次只滑动一个项目。我在互联网上进行了一些搜索,但我得到了一些具有自定义 RecyclerView 的第三方库。我们可以在 RecyclerView 中实现每次滑动一个项目吗?如果可以,请告诉我如何操作? 像这样每次只滑动一个项目 image。
我尝试为 RecyclerView 添加滚动监听器并编写了一些逻辑,但我无法每次只滑动一个项目。我在互联网上进行了一些搜索,但我得到了一些具有自定义 RecyclerView 的第三方库。我们可以在 RecyclerView 中实现每次滑动一个项目吗?如果可以,请告诉我如何操作? 像这样每次只滑动一个项目 image。
这使得项目之间的移动更加平滑:
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);
我知道,这有点晚了。
使用自定义的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;
}
}
这基本上是标准方法,但没有添加一个由滚动速度计算的跳转计数器。
如果您快速且长时间地滑动,则下一个(或上一个)视图将居中显示。
如果您缓慢而短暂地滑动,则当前居中的视图在释放后仍保持居中。
我希望这个答案仍然可以帮助任何人。
PagerSnapHelper()
代替 LinearSnapHelper()
。 - Bilal Kazi