Đây là một tình huống phức tạp, xin lỗi vì tài liệu không đủ.
Khi nội dung bộ điều hợp thay đổi (và bạn gọi notify***()
) RecyclerView yêu cầu một bố cục mới. Từ thời điểm đó, cho đến khi hệ thống bố trí quyết định tính toán bố cục mới (<16 ms), vị trí bố trí và vị trí bộ điều hợp có thể không khớp vì bố cục chưa phản ánh các thay đổi của bộ điều hợp.
Trong trường hợp sử dụng của bạn, vì dữ liệu của bạn có liên quan đến nội dung bộ điều hợp của bạn (và tôi giả sử rằng dữ liệu được thay đổi đồng thời với các thay đổi bộ điều hợp), bạn nên sử dụng adapterPosition
.
Tuy nhiên, hãy cẩn thận, nếu bạn đang gọi notifyDataSetChanged()
, vì nó làm mất hiệu lực của mọi thứ, RecyclerView không biết rằng vị trí bộ điều hợp của ViewHolder cho đến khi bố trí tiếp theo được tính toán. Trong trường hợp đó, getAdapterPosition()
sẽ trả về RecyclerView#NO_POSITION
( -1
).
Nhưng giả sử nếu bạn đã gọi notifyItemInserted(0)
, getAdapterPosition()
ViewHolder trước đó đã ở vị trí 0
sẽ bắt đầu quay lại 1
ngay lập tức. Vì vậy, miễn là bạn đang gửi các sự kiện thông báo chi tiết, bạn luôn ở trạng thái tốt (chúng tôi biết vị trí bộ điều hợp mặc dù bố cục mới chưa được tính toán).
Một ví dụ khác, nếu bạn đang làm điều gì đó khi người dùng nhấp vào, nếu getAdapterPosition()
trả về NO_POSITION
, tốt nhất là bỏ qua nhấp chuột đó vì bạn không biết người dùng đã nhấp vào cái gì (trừ khi bạn có một số cơ chế khác, ví dụ: id ổn định để tra cứu mục).
Chỉnh sửa khi vị trí bố cục tốt
LinearLayoutManager
Giả sử bạn đang sử dụng và muốn truy cập ViewHolder phía trên mục hiện được nhấp. Trong trường hợp đó, bạn nên sử dụng vị trí bố trí để lấy mục ở trên.
mRecyclerView.findViewHolderForLayoutPosition(myViewHolder.getLayoutPosition() - 1)
Bạn phải sử dụng vị trí bố cục vì nó khớp với những gì người dùng hiện đang nhìn thấy trên màn hình.