Google I / O 2019 Güncellemesi
ViewPager2 burada!
Google , 'Android'deki Yenilikler' (diğer adıyla 'Android açılış konuşması') konuşmasında RecyclerView'e dayalı yeni bir ViewPager üzerinde çalıştıklarını duyurdu !
Slaytlardan:
ViewPager gibi ama daha iyi
- ViewPager'dan kolay geçiş
- RecyclerView'e göre
- Sağdan Sola mod desteği
- Dikey sayfalara izin verir
- Geliştirilmiş veri seti değişiklik bildirimleri
En son sürümü buradan ve sürüm notlarını buradan kontrol edebilirsiniz . Bir de bulunmaktadır resmi numune .
Kişisel görüş: Bunun gerçekten gerekli bir ilave olduğunu düşünüyorum. Son zamanlarda PagerSnapHelper
sağa salınan solda süresiz olarak çok sorun yaşadım - açtığım bileti görün .
Yeni cevap (2016)
Artık sadece bir SnapHelper kullanabilirsiniz .
ViewPager'a benzer bir ortaya hizalı yapışma davranışı istiyorsanız, PagerSnapHelper'ı kullanın :
SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
Ayrıca bir LinearSnapHelper vardır . Ben denedim ve eğer enerji ile savaşırsanız, 2 öğeyi 1 atışla kaydırır. Şahsen ben hoşuma gitmedi, ancak kendi kendinize karar verin - denemek sadece saniyeler sürer.
Orijinal cevap (2016)
Sonra birçok 3 farklı çözümler çalışmakla saat SO burada buldum nihayet taklit çok yakından davranış bulduğu bir çözüm inşa ettik ViewPager
.
Çözüm, @eDizzle çözümüne dayanıyor ve bunun neredeyse bir ViewPager
.
Önemli: Öğelerimin RecyclerView
genişliği ekranla tamamen aynı. Diğer bedenlerle denemedim. Ayrıca yatay olarak kullanıyorum LinearLayoutManager
. Dikey kaydırma istiyorsanız kodu uyarlamanız gerekeceğini düşünüyorum.
İşte kodunuz var:
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);
}
}
}
}
Zevk almak!