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은 . 나는 그것을 시도하고 당신이 에너지로 날뛰면 그것은 1 날 뛰기로 2 항목을 스크롤합니다. 개인적으로 나는 그것을 좋아하지 않았지만 스스로 결정하십시오.
원문 답변 (2016)
여기에서 찾은 3 가지 다른 솔루션을 여러 시간 시도한 후 마침내 .NET Framework에서 발견 된 동작을 매우 가깝게 모방하는 솔루션을 구축했습니다 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);
}
}
}
}
즐겨!