2017-12-16 25 views
7

Tôi đang sử dụng thanh cuộn nhanh RecyclerView mặc định và tôi đã theo dõi this guide để hỗ trợ.RecyclerXem chiều cao ngón tay cái cuộn nhanh quá nhỏ cho bộ dữ liệu lớn

Bây giờ, vấn đề là ngón tay cái thay đổi kích thước của nó theo kích thước của tập dữ liệu. Đối với các vật lớn như 100 và cao hơn, ngón cái trở nên rất nhỏ và gần như trở nên khó trả lời khi kéo.

Có cách nào tôi có thể đặt chiều cao tối thiểu cho ngón tay cái cuộn nhanh không.

+2

Cùng một vấn đề trong ứng dụng của tôi. Chúng tôi có thể xác định một ngón tay cái sửa chữa, mà không nhận được nhỏ tùy thuộc vào kích thước danh sách? – egmontr

+1

Cùng một vấn đề trong Ứng dụng của tôi –

+0

Câu trả lời ở trên rất hạn chế. Đây là [ví dụ] (https://bitbucket.org/StylingAndroid/scrollingrecyclerview/src/2fc7d871b911144b492744bb3a5097bb01869ac1?at=Part1) về những gì bạn muốn làm. –

Trả lời

3

Đây chỉ là câu trả lời một phần; Tôi đang thiếu (ít nhất) một phần của câu đố, nhưng hy vọng một người khác có thể tìm ra.

Một khi bạn đã thêm các thuộc tính cần thiết để tag <RecyclerView> của bạn (như đã đề cập trong câu trả lời liên quan trong câu hỏi OP) thì việc kích thước/vị trí của ngón tay cái thanh cuộn được điều khiển bởi ba phương pháp bên LinearLayoutManager:

  • int computeVerticalScrollRange(): Kích thước của đường đi của thanh cuộn.

  • int computeVerticalScrollExtent(): Kích thước ngón tay cái của thanh cuộn.

  • int computeVerticalScrollOffset(): Khoảng cách giữa đầu đường đi của thanh cuộn và đầu ngón tay cái của thanh cuộn.

Các đơn vị cho các phương pháp này là tùy ý; bạn có thể sử dụng bất cứ điều gì bạn muốn miễn là tất cả ba phương pháp chia sẻ cùng một đơn vị. Theo mặc định, LinearLayoutManager sẽ sử dụng một trong hai bộ của các đơn vị:

  • mSmoothScrollbarEnabled == true: Sử dụng đơn vị căn cứ vào kích thước điểm ảnh của vật được nhìn thấy trong RecyclerView.

  • mSmoothScrollbarEnabled == false: Sử dụng các đơn vị dựa trên vị trí của các mục hiển thị trong bộ điều hợp của RecyclerView.

Để kiểm soát kích thước của ngón tay cái của thanh cuộn mình, bạn sẽ phải ghi đè lên các phương pháp ... nhưng đây là mảnh Tôi đang mất tích: Trong tất cả các thử nghiệm của tôi, computeVerticalScrollExtent() không bao giờ được gọi bằng các hệ thống. Điều đó nói rằng, chúng tôi vẫn có thể hiển thị một số tiến bộ ở đây.

Trước tiên, tôi đã tạo một bộ điều hợp đơn giản hiển thị 500 CardView s với vị trí của mục bên trong. Tôi đã bật tính năng cuộn nhanh với một số bản vẽ thực sự đơn giản (nhưng xấu xí). Dưới đây là những gì các thanh cuộn trông giống như chỉ với một thực hiện mặc định LinearLayoutManager:

enter image description here

Như bạn đã thấy, với 500 mặt hàng (nhỏ), ngón tay cái thanh cuộn là thực sự nhỏ và khá khó khăn để khai thác trên. Chúng tôi có thể làm cho thanh cuộn lớn hơn đáng kể bằng cách ghi đè computeVerticalScrollRange() để chỉ trả về hằng số cố định ...Tôi nhặt 5000 về cơ bản một cách ngẫu nhiên chỉ để hiển thị sự thay đổi lớn:

enter image description here

Tất nhiên, bây giờ thanh cuộn không hoạt động như bạn mong muốn; di chuyển danh sách bằng cách kéo vào nó như bình thường di chuyển ngón tay cái nhiều hơn nó nên, và nhanh chóng di chuyển danh sách bằng cách kéo trên ngón tay cái di chuyển danh sách ít hơn nó nên.

Trên điện thoại của tôi, với phạm vi ngẫu nhiên được lựa chọn của 5000, trọng computeVerticalScrollOffset() như sau làm cho ngón tay cái thanh cuộn di chuyển một cách hoàn hảo khi tôi cuộn danh sách bằng cách kéo vào nó:

@Override 
public int computeVerticalScrollRange(RecyclerView.State state) { 
    return 5000; 
} 

@Override 
public int computeVerticalScrollOffset(RecyclerView.State state) { 
    return (int) (super.computeVerticalScrollOffset(state)/23.5f); 
} 

Tuy nhiên, đây vẫn doesn' t khắc phục vấn đề thứ hai: kéo trên ngón tay cái chính nó không di chuyển một cách chính xác danh sách. Như tôi đã đề cập ở trên, có vẻ như điều thích hợp để làm ở đây sẽ là ghi đè lên computeVerticalScrollExtent(), nhưng hệ thống không bao giờ gọi phương thức này. Tôi thậm chí đã ghi đè nó chỉ đơn giản là ném một ngoại lệ, và ứng dụng của tôi không bao giờ bị treo.

Hy vọng điều này ít nhất giúp hướng mọi người đi đúng hướng để có giải pháp đầy đủ.

PS: Việc triển khai computeVerticalScrollRange()computeVerticalScrollOffset() Tôi đã đưa vào câu trả lời này là cố ý đơn giản (đọc: không có thật). Triển khai "thực" sẽ phức tạp hơn nhiều; việc triển khai mặc định LinearLayoutManager sẽ tính đến hướng thiết bị, mục đầu tiên và cuối cùng có thể nhìn thấy trong danh sách, số lượng mục trên màn hình theo cả hai hướng, cuộn trơn tru, cờ bố cục khác nhau, v.v.

Các vấn đề liên quan