2015-12-01 32 views
7

Tôi có RecyclerView + LinearLayoutManger đang sử dụng bộ điều hợp chứa tin nhắn trò chuyện. Tôi giới hạn số lượng tin nhắn trò chuyện đến 100 tin nhắn gần đây nhất. Vấn đề này là khi tôi loại bỏ các cuộc trò chuyện cũ, vị trí di chuyển của các cuộc trò chuyện trong những thay đổi recyclerview vì chỉ số 0 đã được gỡ bỏ. Tôi đã bắt đầu viết mã bên dưới:Tìm bù đắp đầu tiên của mục hiển thị đầu tiên trong RecyclerView

int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 
View v = layoutManager.getChildAt(firstVisiblePosition); 
if (firstVisiblePosition > 0 && v != null) { 
    int offsetTop = //need to get the view offset here; 
    chatAdapter.notifyDataSetChanged(); 

    if (firstVisiblePosition - 1 >= 0 && chatAdapter.getItemCount() > 0) { 
     layoutManager.scrollToPositionWithOffset(firstVisiblePosition - 1, offsetTop); 
    } 
} 

Tôi nghĩ sẽ dễ dàng nhận được bù đắp hiển thị của vị trí mục hiển thị đầu tiên. Ví dụ nếu chế độ xem hiển thị đầu tiên là 300dp nhưng chỉ hiển thị 200dp cuối cùng, tôi muốn nhận được bù đắp 100.

Bằng cách này tôi có thể sử dụng scrollToPositionWithOffset (firstVisiblePosition - 1, offsetTop).

Tôi có thiếu gì đó ở đây không? Điều này có vẻ như nó sẽ là một vấn đề dễ dàng để tìm ra, nhưng tôi đã không thấy bất kỳ phương pháp nào có thể hỗ trợ điều này.

+1

bạn đã thử với 'v.getHeight() - v.getTop()' – Blackbelt

+0

Tôi sẽ xem xét kỹ hơn. Tôi nghĩ v.getTop() nhận tọa độ y của tổng chiều cao cuộn, không liên quan đến vị trí của chính bản thân recyclerview. – tylerjroach

Trả lời

8

@Blackbelt. Cảm ơn bạn đã giúp tôi đi đúng hướng.

Mức chênh lệch mà tôi cần thực sự chỉ là v.getTop();

Vấn đề thực sự của tôi là trong getChildAt(). Rõ ràng getChildAt bắt đầu ở vị trí nhìn thấy đầu tiên, không phải ở vị trí của bộ điều hợp. Tài liệu này được viết kém trong trường hợp này.

Đây là mã kết quả.

int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 
View v = layoutManager.getChildAt(0); 
if (firstVisiblePosition > 0 && v != null) { 
    int offsetTop = v.getTop(); 
    chatAdapter.notifyDataSetChanged(); 

    if (firstVisiblePosition - 1 >= 0 && chatAdapter.getItemCount() > 0) { 
     layoutManager.scrollToPositionWithOffset(firstVisiblePosition - 1, offsetTop); 
    } 
} 
+0

Bạn có thể sử dụng 'Xem v = layoutManager.findViewByPosition (vị trí)' –

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