2016-08-04 29 views
10

Chiều cao của mục RecyclerView là không cố định, tôi cần đặt hình nền cho mỗi mục, vì vậy tôi muốn lấy chiều cao của mục của recyclerview thay đổi kích thước hình ảnh, nhưng itemView.getHeight() luôn trả về 0 trong onBindViewHolder.Cách lấy chiều cao của mục recyclerview trong "onBindViewHolder"

Tôi đã cố gắng tìm kiếm nhiều câu hỏi hoặc bài viết, nhưng tôi vẫn không thể có được sự đánh giá tốt.

Trả lời

22

ngắn

Đo View bằng tay

view.measure(
      View.MeasureSpec.makeMeasureSpec(recyclerViewWidth, View.MeasureSpec.EXACTLY), 
      View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 

và có được chiều cao với view.getMeasuredHeight()

nền

Một quan điểm sẽ trả về một giá trị hợp lệ cho View.getHeight() chỉ sau nó đã được được đo. Việc đo chính nó sẽ tự động xảy ra bởi hệ thống khi màn hình sắp được hiển thị trên màn hình.

Khi Android muốn hiển thị bố cục, nó sẽ đệ quy gọi hàm view.layout() cho mỗi chế độ xem trong cây chế độ xem. Mỗi Phụ Huynh nói với con cái những ràng buộc mà họ có thể có (chiều rộng/chiều cao) và yêu cầu họ tự làm theo số view.measure(). Do đó, chế độ xem sẽ lưu trữ các giá trị được đo BASED về các ràng buộc trong các thành viên được chỉ định (MeasuredHeight/Width). Lưu ý rằng tại thời điểm này, view.getMeasuredHeight() sẽ giữ giá trị trong khi view.getHeight() sẽ vẫn không hợp lệ. view.getHeight() sẽ chỉ trả lại giá trị hợp lệ khi chế độ xem có chiều cao thực tế trong phân cấp UI.

Tóm tắt

Vì vậy, để biết chiều cao của một yếu tố xem, trước khi nó đã được đo và đặt ra bởi hệ thống, chúng tôi sẽ cần phải gọi view.measure() chức năng bằng tay.

Hàm đo lường dự kiến ​​2 tham số bắt nguồn từ khung nhìn LayoutParams + ràng buộc gốc.

Trong mẫu mã trên, chúng tôi đang đo chế độ xem buộc chiều rộng của nó là CHÍNH XÁC chiều rộng của cha mẹ (RecycleView) và chiều cao không bị giới hạn.

+1

Có! Bạn đã lưu cho tôi rất nhiều dòng mã! Cám ơn – Titmael

6

Tôi khuyên bạn nên xác định nhiều tệp bố cục với chiều cao dự kiến ​​và tăng cường chúng theo một số tiêu chí trong tập dữ liệu của bạn.

VH onCreateViewHolder (ViewGroup parent, 
       int viewType){ 
if(some condition){ 
//inflate layout 1 
}else{ 
//inflate layout 2 
} 

hoặc trả lời here: bạn có thể nhận được các số đo khi khởi tạo người giữ quan điểm

viewHolder.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 
int width = viewHolder.getMeasuredWidth(); 
int height = viewHolder.getMeasuredHeight(); 
Các vấn đề liên quan