Google I / O 2019 अपडेट
ViewPager2 यहाँ है!
Google ने सिर्फ 'व्हाट्स न्यू इन एंड्रॉइड' (उर्फ 'एंड्रॉइड कीनोट') की बात करते हुए घोषणा की कि वे RecyclerView पर आधारित एक नए ViewPager पर काम कर रहे हैं!
स्लाइड्स से:
ViewPager की तरह, लेकिन बेहतर
- ViewPager से आसान प्रवास
- RecyclerView पर आधारित है
- दाएँ-से-बाएँ मोड का समर्थन
- ऊर्ध्वाधर पेजिंग की अनुमति देता है
- बेहतर डेटासेट सूचनाएँ बदलते हैं
आप यहां नवीनतम संस्करण और यहां जारी नोटों की जांच कर सकते हैं । एक आधिकारिक नमूना भी है ।
व्यक्तिगत राय: मुझे लगता है कि यह वास्तव में आवश्यक जोड़ है। मुझे हाल ही में PagerSnapHelper
अनिश्चित काल के लिए बाएं ओर के दोलन के साथ बहुत परेशानी हुई है - मैंने जो टिकट खोला है, उसे देखें।
नया उत्तर (2016)
अब आप केवल SnapHelper का उपयोग कर सकते हैं ।
यदि आप ViewPager के समान एक केंद्र-संरेखित तड़क- भड़क वाला व्यवहार चाहते हैं, तो PagerSnapHelper का उपयोग करें :
SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
एक LinearSnapHelper भी है । मैंने इसे आज़माया है और अगर आप ऊर्जा के साथ भागते हैं तो यह 1 आइटम के साथ 2 वस्तुओं को स्क्रॉल करता है। व्यक्तिगत रूप से मुझे यह पसंद नहीं था, लेकिन बस खुद से निर्णय लें - यह कोशिश करने में केवल सेकंड लगते हैं।
मूल उत्तर (2016)
एसओ में यहां मिले 3 अलग-अलग समाधानों की कोशिश करने के कई घंटों के बाद मैंने आखिरकार एक समाधान बनाया है जो एक में पाए जाने वाले व्यवहार की बहुत बारीकी से नकल करता है 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);
}
}
}
}
का आनंद लें!