Pembaruan Google I / O 2019
ViewPager2 ada di sini!
Google baru saja mengumumkan pada pembicaraan 'What's New in Android' (alias 'The Android keynote') bahwa mereka sedang mengerjakan ViewPager baru berdasarkan RecyclerView!
Dari slide:
Seperti ViewPager, tetapi lebih baik
- Migrasi mudah dari ViewPager
- Berdasarkan RecyclerView
- Dukungan mode Kanan-ke-Kiri
- Memungkinkan paging vertikal
- Pemberitahuan perubahan set data yang ditingkatkan
Anda dapat memeriksa versi terbaru di sini dan catatan rilisnya di sini . Ada juga sampel resmi .
Pendapat pribadi: Saya pikir ini adalah tambahan yang sangat dibutuhkan. Saya baru-baru ini mengalami banyak masalah dengan PagerSnapHelper kiri kanan yang berosilasi tanpa batas waktu - lihat tiket yang telah saya buka.
Jawaban baru (2016)
Anda sekarang dapat menggunakan SnapHelper .
Jika Anda menginginkan perilaku gertakan rata tengah yang mirip dengan ViewPager, gunakan PagerSnapHelper :
SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
Ada juga LinearSnapHelper . Saya sudah mencobanya dan jika Anda fling dengan energi maka itu menggulung 2 item dengan 1 lemparan. Secara pribadi saya tidak menyukainya, tetapi memutuskan sendiri - mencobanya hanya membutuhkan beberapa detik.
Jawaban asli (2016)
Setelah berjam - jam mencoba 3 solusi berbeda yang ditemukan di SO, saya akhirnya membuat solusi yang sangat mirip dengan perilaku yang ditemukan di file ViewPager.
Solusinya didasarkan pada solusi @eDizzle , yang saya yakin telah cukup saya tingkatkan untuk mengatakan bahwa itu bekerja hampir seperti ViewPager.
Penting: RecyclerViewlebar item saya persis sama dengan layar. Saya belum mencoba dengan ukuran lain. Saya juga menggunakannya dengan horizontal LinearLayoutManager. Saya pikir Anda perlu menyesuaikan kode jika Anda ingin scroll vertikal.
Di sini Anda memiliki kodenya:
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);
}
}
}
}
Nikmati!