การอัปเดต Google I / O 2019
ViewPager2อยู่ที่นี่แล้ว!
Google เพิ่งประกาศในงานเสวนา 'มีอะไรใหม่ใน Android' (aka 'The Android keynote') ว่าพวกเขากำลังทำงานบน ViewPager ใหม่ที่ใช้ RecyclerView!
จากสไลด์:
เหมือน ViewPager แต่ดีกว่า
- โยกย้ายได้ง่ายจาก ViewPager
- ขึ้นอยู่กับ RecyclerView
- รองรับโหมดขวาไปซ้าย
- อนุญาตการเพจแนวตั้ง
- ปรับปรุงการแจ้งเตือนการเปลี่ยนแปลงชุดข้อมูล
คุณสามารถตรวจสอบรุ่นล่าสุดที่นี่และปล่อยบันทึกที่นี่ นอกจากนี้ยังมีกลุ่มตัวอย่างเป็นทางการ
ความคิดเห็นส่วนตัว:ฉันคิดว่านี่เป็นส่วนเสริมที่จำเป็นจริงๆ เมื่อเร็ว ๆ นี้ฉันมีปัญหามากมายกับการPagerSnapHelper
แกว่งไปทางซ้ายไปเรื่อย ๆ - ดูตั๋วที่ฉันเปิด
คำตอบใหม่ (2016)
ตอนนี้คุณสามารถใช้SnapHelperได้แล้ว
หากคุณต้องการให้พฤติกรรมสแนปชิดตรงกลางคล้ายกับViewPagerให้ใช้PagerSnapHelper :
SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
นอกจากนี้ยังมีLinearSnapHelper ฉันได้ลองแล้วและถ้าคุณพุ่งด้วยพลังงานมันจะเลื่อน 2 รายการโดยเหวี่ยง 1 ครั้ง โดยส่วนตัวแล้วฉันไม่ชอบ แต่เพียงแค่ตัดสินใจด้วยตัวเอง - ลองใช้เวลาเพียงไม่กี่วินาที
คำตอบเดิม (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);
}
}
}
}
สนุก!