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: RecyclerView
lebar 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!