2016-04-12 19 views
11

Tôi có chế độ xem Recycler nằm bên trong của SwipeRefreshLayout. Ngoài ra, có khả năng mở từng mục trong một hoạt động khác. Sau khi quay trở lại Recycler, tôi cần cuộn đến mục đã chọn hoặc đến Y. trước đây để thực hiện điều đó?Làm thế nào để lưu vị trí cuộn của RecyclerView trong Android?

Có, tôi googled, tìm thấy các bài viết trong StackOverFlow về cách lưu thể hiện của trình quản lý bố cục, như sau: RecyclerView store/restore state between activities. Nhưng, nó không giúp tôi.

CẬP NHẬT

Ngay bây giờ tôi có loại này giải quyết vấn đề, nhưng, tất nhiên, nó cũng không hoạt động.

private int scrollPosition; 

...//onViewCreated - it is fragment 
recyclerView.setHasFixedSize(true); 
LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
recyclerView.setLayoutManager(llm); 
data = new ArrayList<>(); 
adapter.setData(getActivity(), data); 
recyclerView.setAdapter(adapter); 
... 

@Override 
public void onResume() { 
    super.onResume(); 
    recyclerView.setScrollY(scrollPosition); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    scrollPosition = recyclerView.getScrollY(); 
} 

Có, tôi đã thử scrollTo (int, int) - doen't work.

Bây giờ tôi đã thử chỉ cần cuộn, ví dụ, đến Y = 100, nhưng nó không cuộn chút nào.

+1

Hãy gửi mã của bạn & những gì bạn đã đạt được cho đến nay. – yennsarah

+0

Có thể trùng lặp [cách lưu vị trí cuộn recyclerview, với recyclerview.state hoặc không] (http://stackoverflow.com/questions/27816217/how-to-save-recyclerview-scroll-position-with-recyclerview-state- or-no) –

+0

@MadhukarHebbar Tôi đã kiểm tra nó, và nó cũng không hoạt động ... – DefaultXYZ

Trả lời

29

Lưu trạng thái hiện tại của xem rác vị trí @ onPause:

positionIndex= llManager.findFirstVisibleItemPosition(); 
    View startView = rv.getChildAt(0); 
    topView = (startView == null) ? 0 : (startView.getTop() - rv.getPaddingTop()); 

Khôi phục vị trí cuộn @onResume:

if (positionIndex!= -1) { 
     llManager.scrollToPositionWithOffset(positionIndex, topView); 
    } 

hay cách khác có thể @onPause:

long currentVisiblePosition = 0; 
currentVisiblePosition = ((LinearLayoutManager)rv.getLayoutManager()).findFirstCompletelyVisibleItemPosition(); 

khôi phục @onResume:

((LinearLayoutManager) rv.getLayoutManager()).scrollToPosition(currentVisiblePosition); 
currentVisiblePosition = 0; 
+1

Giải pháp đầu tiên hiệu quả, cảm ơn !! – benzabill

+1

Giải pháp tuyệt vời .. !! –

2

tài tái chế của bạn xem linearlayoutmanager để nhận vị trí cuộn

int position = 0; 
if (linearLayoutManager != null) { 
    scrollPosition = inearLayoutManager.findFirstVisibleItemPosition(); 
} 

và khi khôi phục sử dụng đoạn mã sau

if (linearLayoutManager != null) { 
    cardRecyclerView.scrollToPosition(mScrollPosition); 
} 

Hy vọng điều này sẽ giúp bạn

+0

xin lỗi, nhưng câu trả lời đó là ý kiến ​​đầu tiên trong câu hỏi của tôi. – DefaultXYZ

9

Rất nhiều những câu trả lời dường như hơn làm phức tạp nó.

LayoutManager hỗ trợ onRestoreInstanceState ngoài hộp để không cần phải lưu vị trí cuộn vv Phương pháp tích hợp sẵn đã lưu vị trí hoàn hảo của pixel.

dụ đoạn mã (null kiểm tra vv xóa do rõ ràng):

private Parcelable listState; 
private RecyclerView list; 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    listState=savedInstanceState.getParcelable("ListState"); 

} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putParcelable("ListState", list.getLayoutManager().onSaveInstanceState()); 

} 

sau đó chỉ cần gọi

list.getLayoutManager().onRestoreInstanceState(listState); 

khi dữ liệu của bạn đã được gắn lại để bạn RecyclerView

+1

WoW! Giải pháp đơn giản và dễ dàng :) –

+0

Tôi nghĩ đây là giải pháp tốt nhất !! – illusionJJ

+0

Tôi phải thêm 'android: configChanges =" orientation | screenSize "' vào AndroidManifest.xml. Hơn so với mã trên làm việc. Cảm ơn –

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