ฉันต้องการแก้ไขปัญหาของระยะเวลาในการเลื่อนให้ครบถ้วนมากขึ้นซึ่งคุณควรเลือกคำตอบก่อนหน้านี้อันที่จริงแล้วจะแตกต่างกันไปอย่างมาก (และยอมรับไม่ได้) ตามจำนวนการเลื่อนที่จำเป็นเพื่อให้ไปถึงตำแหน่งเป้าหมายจากตำแหน่งปัจจุบัน
เพื่อให้ได้ระยะเวลาการเลื่อนที่สม่ำเสมอความเร็ว (พิกเซลต่อมิลลิวินาที) จะต้องพิจารณาขนาดของแต่ละรายการ - และเมื่อรายการมีขนาดที่ไม่ได้มาตรฐานจะมีการเพิ่มระดับความซับซ้อนใหม่ทั้งหมด
นี่อาจเป็นสาเหตุที่นักพัฒนาRecyclerViewติดตั้งตะกร้าที่แข็งเกินไปสำหรับลักษณะสำคัญของการเลื่อนที่ราบรื่น
สมมติว่าคุณต้องการระยะเวลาในการเลื่อนแบบกึ่งสม่ำเสมอและรายการของคุณมีรายการกึ่งเครื่องแบบคุณจะต้องมีสิ่งนี้
/** Smoothly scroll to specified position allowing for interval specification. <br>
* Note crude deceleration towards end of scroll
* @param rv Your RecyclerView
* @param toPos Position to scroll to
* @param duration Approximate desired duration of scroll (ms)
* @throws IllegalArgumentException */
private static void smoothScroll(RecyclerView rv, int toPos, int duration) throws IllegalArgumentException {
int TARGET_SEEK_SCROLL_DISTANCE_PX = 10000; // See androidx.recyclerview.widget.LinearSmoothScroller
int itemHeight = rv.getChildAt(0).getHeight(); // Height of first visible view! NB: ViewGroup method!
itemHeight = itemHeight + 33; // Example pixel Adjustment for decoration?
int fvPos = ((LinearLayoutManager)rv.getLayoutManager()).findFirstCompletelyVisibleItemPosition();
int i = Math.abs((fvPos - toPos) * itemHeight);
if (i == 0) { i = (int) Math.abs(rv.getChildAt(0).getY()); }
final int totalPix = i; // Best guess: Total number of pixels to scroll
RecyclerView.SmoothScroller smoothScroller = new LinearSmoothScroller(rv.getContext()) {
@Override protected int getVerticalSnapPreference() {
return LinearSmoothScroller.SNAP_TO_START;
}
@Override protected int calculateTimeForScrolling(int dx) {
int ms = (int) ( duration * dx / (float)totalPix );
// Now double the interval for the last fling.
if (dx < TARGET_SEEK_SCROLL_DISTANCE_PX ) { ms = ms*2; } // Crude deceleration!
//lg(format("For dx=%d we allot %dms", dx, ms));
return ms;
}
};
//lg(format("Total pixels from = %d to %d = %d [ itemHeight=%dpix ]", fvPos, toPos, totalPix, itemHeight));
smoothScroller.setTargetPosition(toPos);
rv.getLayoutManager().startSmoothScroll(smoothScroller);
}
PS:ผมสาปแช่งวันที่ฉันเริ่มกราดแปลงListViewเพื่อRecyclerView
protected int getHorizontalSnapPreference() { return LinearSmoothScroller.SNAP_TO_START; }
เพียงสองสิ่งที่เพิ่มเติมฉันมีที่จะต้องพิจารณาในการดำเนินงานของเราในฐานะที่ฉันมีเลื่อนแนวนอนดูผมต้องชุดpublic PointF computeScrollVectorForPosition(int targetPosition) { return layoutManager.computeScrollVectorForPosition(targetPosition); }
นอกจากนี้ผมต้องใช้วิธีการที่เป็นนามธรรม