2015-04-11 16 views
14

Cách lấy vị trí cuộn trong Recyclerview hoặc Layoutmanager?Làm cách nào để có được Scrollposition trong Recyclerview/Layoutmanager?

tôi có thể đo scrollposition bằng cách thêm một OnScrollListener, nhưng khi định hướng thay đổi scrollDy là 0.

mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 
      int scrollDy = 0; 
      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 
      } 

      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
       scrollDy += dy; 
      } 
     }); 
+3

Bạn có thể cải thiện chất lượng câu hỏi của mình một chút không? Câu trả lời của bạn có vẻ tốt, nhưng câu hỏi cần nêu rõ vấn đề đang được giải quyết rõ ràng hơn. –

+0

https://stackoverflow.com/questions/36568168/how-to-save-scroll-position-of-recyclerview-in-android/36569778#3656977 này là câu trả lời đúng. Có một cái nhìn, nó làm việc cho tôi. –

Trả lời

32

Bạn không thể lấy nó bởi vì nó không thực sự tồn tại. LayoutManager chỉ biết về các chế độ xem trên màn hình, nó không biết các chế độ xem trước đó, kích thước của chúng là gì?

Số bạn có thể đếm bằng cách sử dụng trình xử lý cuộn không đáng tin cậy vì nếu thay đổi dữ liệu, RecyclerView sẽ tạo bố cục mới tính toán và sẽ không cố gắng tính lại khoản chênh lệch thực (bạn sẽ nhận được onScroll(0, 0) nếu số lượt xem được di chuyển).

RecyclerView ước tính giá trị này cho thanh cuộn, bạn có thể sử dụng cùng phương pháp từ lớp View.

computeHorizontalScrollExtent

computeHorizontalScrollRange

computeHorizontalScrollOffset

Những phương pháp này có các đối tác dọc của họ là tốt.

+1

Xin chào yigit lần nữa :) Tôi là người đã gửi thư cho bạn lần trước. Vì vậy, tôi muốn di chuyển các chế độ xem trên màn hình như sau: https://github.com/ksoichiro/Android-ObservableScrollView/blob/master/samples/images/demo12.gif Tôi có thể thực hiện việc này bằng cách sử dụng phương pháp ở trên . Nhưng sau khi định hướng thay đổi lĩnh vực này là 0. Làm thế nào một giải pháp đáng tin cậy có thể trông như thế nào? Bởi vì câu trả lời của bạn cũng cho thấy rằng việc lưu trữ các cuộn trong một lưu địa sẽ không làm cho mọi thứ tốt hơn, đúng không? – seb

+0

Tôi nghĩ tùy chọn tốt nhất của bạn là khôi phục vị trí cuộn của bạn sau khi xoay. Bạn có thể có được vị trí nhìn thấy đầu tiên và tính toán vị trí cuộn của bạn tùy thuộc vào đó. Bạn cũng có thể duyệt con của trình quản lý bố cục, LLM đảm bảo rằng thứ tự vị trí con sẽ khớp với thứ tự bộ điều hợp. Đây không phải là một bảo đảm API nhưng rất không có khả năng thay đổi. – yigit

+0

Dường như tất cả các phương thức này đều trả về 0, thực thi mặc định. Bạn dự kiến ​​sẽ triển khai phương thức này trong trình quản lý bố cục. –

0

Bạn phải đọc scrollDy trong

public void onScrollStateChanged(RecyclerView recyclerView, int newState) 

sau đó bạn có thể nhận recyclerView' s vị trí cuộn

+0

điều này thường sẽ không được kích hoạt khi danh sách cuộn sau khi thêm/xóa các mục – martyglaubitz

2

tôi đến câu hỏi chỉ muốn để có được chỉ số vị trí mục mà hiện tại đang cuộn tới. Đối với những người muốn làm như vậy, bạn có thể sử dụng như sau:

LinearLayoutManager myLayoutManager = myRecyclerView.getLayoutManager(); 
int scrollPosition = myLayoutManager.findFirstVisibleItemPosition(); 

Bạn cũng có thể có được những vị trí khác:

  • findLastVisibleItemPosition()
  • findFirstCompletelyVisibleItemPosition()
  • findLastCompletelyVisibleItemPosition()

Cảm ơn this answer để được trợ giúp về vấn đề này. Nó cũng cho thấy cách lưu và khôi phục vị trí cuộn.

4

Đối với sử dụng trong tương lai, Nếu bạn đang chuyển đổi giữa Fragments trong cùng một activity và tất cả các bạn muốn làm là lưu di chuyển vị trí cho recyclerview và sau đó khôi phục recyclerview với cùng cuộn-position, bạn có thể làm như sau:

Trong onStop()/onDestroyView()/onPause() của bạn bất cứ điều gì gọi là thích hợp hơn, làm được điều này:

Parcelable recylerViewState = recyclerView.getLayoutManager().onSaveInstanceState(); 

Và Trongcủa bạnbất cứ điều gì gọi là thích hợp hơn, làm được điều này:

recyclerView.getLayoutManager().onRestoreInstanceState(recylerViewState); 

Bằng cách này bạn có thể giữ thành công nhà nước recyclerView's của bạn trong một parcelable và khôi phục lại nó bất cứ khi nào bạn muốn.

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