2015-03-11 15 views
8

khi gọi notifyDataSetChanged trên RecyclerView nó không giữ lại vị trí cuộn và cuộn lên trên, là có bất kỳ giải pháp để duy trì vị trí của nó cuộn?RecyclerView notifyDataSetChanged cuộn đến vị trí hàng đầu

+0

Bạn đã tìm thấy giải pháp nào? –

+1

** KHÔNG ** gọi 'notifyDataSetChanged()' trên 'RecyclerView'. Sử dụng các phương thức mới như 'notifyItemChanged()', 'notifyItemRangeChanged()', 'notifyItemInserted()', etc ... –

+1

Tôi đã thử notifyItemRangeInserted(), nhưng thậm chí là cuộn lên trên cùng. Bất kỳ ý tưởng? –

Trả lời

3

Không chắc chắn nếu điều này giải quyết vấn đề của bạn nhưng tôi đã gặp vấn đề tương tự và đó là vì tôi đã gọi setAdapter sau khi thông báo. Vì vậy, không gọi setAdapter sau khi thông báo giải quyết được vấn đề.

mAdapter.notifyItemRangeInserted(mAdapter.getItemCount(), list.size() - 1); 
recyclerView.setAdapter(); // remove this line. 
//Do this only when you're setting the data for the first time or when adapter is null. 
+0

Cảm ơn, đó là công việc –

8

Nếu mục danh sách RecyclerView của bạn có thuộc tính "wrap_content", Recyclerview tính lại chiều cao và cuộn lên trên.

Có hai giải pháp:

  1. Đặt chiều cao của bạn một giá trị không đổi như thế này: layout_height="100dp"
  2. Sử dụng StaggeredGridLayoutManager như thế này:

    mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));

nếu bạn muốn thay đổi các mục với hoạt ảnh, sử dụng phương thức notifyItemChanged trong Fragm ent hoặc Activity. Không có trong Adaptor lớp:

mRecyclerView.getAdapter().notifyItemChanged(position); 

Giải pháp thứ hai là hiệu quả hơn và tôi đề nghị này một

+0

Có, chế độ xem Recycler tính toán chiều cao trong trường hợp "wrap_content" để sửa chữa là đặt chiều cao bố cục cố định hoặc tăng chiều cao thành "match_parent". – anp8850

1

RecycleViews sẽ di chuyển trở lại đầu vào bất kỳ biến thể của notifyDataSetChanged nếu họ không có một người quản lý bố trí. Đây là một ví dụ về cách thiết lập một.

recycleView.setLayoutManager(new LinearLayoutManager(context, OrientationHelper.VERTICAL, false)); 
0

Như tôi đoán, những gì bạn đang làm là đặt lại adapter để RecyclerView và sau đó gọi notifyDataSetChanged().

Bạn cần phải vượt qua chỉ dataList để adapter bằng cách thông qua dataList trong phương pháp chuyển đổi như bộ chuyển đổi update(dataList) . Và trong phương pháp này, bạn có thể gán danh sách này vào danh sách bộ điều hợp như;

public void update(ArrayList<Hashmap<String,String> list){ 
    this.mList = list; 
} 
0

bạn có thể giữ được vị trí bằng cách tiết kiệm nó trước khi notifyDataSetChanged và sau đó gọi cuộn trơn tru đến vị trí lưu

final int currentVisibleItem = ((LinearLayoutManager) layourmanager).findFirstCompletelyVisibleItemPosition(); 
          productListAdapter.notifyDataSetChanged(); 
          Handler handler = new Handler(); 
          handler.postDelayed(new Runnable() { 
           @Override 
           public void run() { 

        if(currentVisibleItem>-1 && currentVisibleItem<lstProducts.size()) 
            rv_products.scrollToPosition(currentVisibleItem); 
           } 
          }, 100); 
Các vấn đề liên quan