Google I / O 2019更新
ViewPager2在这里!
Google刚刚在演讲“ Android的新增功能”(又称“ Android主题演讲”)中宣布,他们正在开发基于RecyclerView的新ViewPager!
从幻灯片:
类似于ViewPager,但效果更好
- 从ViewPager轻松迁移
- 基于RecyclerView
- 从右到左模式支持
- 允许垂直分页
- 改进的数据集更改通知
您可以在此处查看最新版本,并在此处查看发行说明。还有一个官方样品。
个人意见:我认为这是真的需要的补充。我最近在PagerSnapHelper
无限地左右摆动时遇到了很多麻烦-请参阅我打开的票。
新答案(2016)
现在,您只需使用SnapHelper即可。
如果您想要类似于ViewPager的中心对齐的捕捉行为,请使用PagerSnapHelper:
SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
还有一个LinearSnapHelper。我已经尝试过了,如果您精力充沛,它会滚动2个项目,其中包含1个。我个人不喜欢它,而是自己决定-尝试只需几秒钟。
原始答案(2016)
经过很多尝试3个不同的解决方案小时内发现这里的SO我终于建立了一个解决方案,模拟非常密切的行为中找到的ViewPager
。
该解决方案基于@eDizzle解决方案,我相信我已经对其进行了改进,可以说它的工作原理几乎与ViewPager
。
重要:我的RecyclerView
项目宽度与屏幕完全相同。我没有尝试过其他尺寸。我也用它水平LinearLayoutManager
。我认为,如果要垂直滚动,则需要调整代码。
这里有代码:
public class SnappyRecyclerView extends RecyclerView {
public SnappyRecyclerView(Context context) {
super(context);
}
public SnappyRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public SnappyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean fling(int velocityX, int velocityY) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) getLayoutManager();
int screenWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
View lastView = linearLayoutManager.findViewByPosition(lastVisibleItemPosition);
int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
View firstView = linearLayoutManager.findViewByPosition(firstVisibleItemPosition);
int leftMargin = (screenWidth - lastView.getWidth()) / 2;
int rightMargin = (screenWidth - firstView.getWidth()) / 2 + firstView.getWidth();
int leftEdge = lastView.getLeft();
int rightEdge = firstView.getRight();
int scrollDistanceLeft = leftEdge - leftMargin;
int scrollDistanceRight = rightMargin - rightEdge;
if (Math.abs(velocityX) < 1000) {
if (leftEdge > screenWidth / 2) {
smoothScrollBy(-scrollDistanceRight, 0);
} else if (rightEdge < screenWidth / 2) {
smoothScrollBy(scrollDistanceLeft, 0);
} else {
if (velocityX > 0) {
smoothScrollBy(-scrollDistanceRight, 0);
} else {
smoothScrollBy(scrollDistanceLeft, 0);
}
}
return true;
} else {
if (velocityX > 0) {
smoothScrollBy(scrollDistanceLeft, 0);
} else {
smoothScrollBy(-scrollDistanceRight, 0);
}
return true;
}
}
@Override
public void onScrollStateChanged(int state) {
super.onScrollStateChanged(state);
if (state == SCROLL_STATE_IDLE) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) getLayoutManager();
int screenWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
View lastView = linearLayoutManager.findViewByPosition(lastVisibleItemPosition);
int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
View firstView = linearLayoutManager.findViewByPosition(firstVisibleItemPosition);
int leftMargin = (screenWidth - lastView.getWidth()) / 2;
int rightMargin = (screenWidth - firstView.getWidth()) / 2 + firstView.getWidth();
int leftEdge = lastView.getLeft();
int rightEdge = firstView.getRight();
int scrollDistanceLeft = leftEdge - leftMargin;
int scrollDistanceRight = rightMargin - rightEdge;
if (leftEdge > screenWidth / 2) {
smoothScrollBy(-scrollDistanceRight, 0);
} else if (rightEdge < screenWidth / 2) {
smoothScrollBy(scrollDistanceLeft, 0);
}
}
}
}
请享用!