ListView thực sự đã có khả năng tự đo đủ cao để hiển thị tất cả các mục, nhưng nó không làm điều này khi bạn chỉ định chỉ định quấn_content (ĐoSpec.UNSPECifyED). Nó sẽ làm điều này khi được đưa ra một chiều cao với Số đoSpec.AT_MOST. Với kiến thức này, bạn có thể tạo một lớp con rất đơn giản để giải quyết vấn đề này hoạt động tốt hơn nhiều so với bất kỳ giải pháp nào được đăng ở trên. Bạn vẫn nên sử dụng quấn_content với lớp con này.
public class ListViewForEmbeddingInScrollView extends ListView {
public ListViewForEmbeddingInScrollView(Context context) {
super(context);
}
public ListViewForEmbeddingInScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ListViewForEmbeddingInScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 4, MeasureSpec.AT_MOST));
}
}
Thao tác với heightMeasureSpec là AT_MOST với kích thước rất lớn (Integer.MAX_VALUE >> 4) khiến ListView đo được tất cả các con của nó theo chiều cao (rất lớn) nhất định và đặt chiều cao phù hợp.
Điều này hoạt động tốt hơn so với các giải pháp khác vì một vài lý do:
- Nó đo lường mọi thứ một cách chính xác (đệm, chia)
- Nó đo ListView trong suốt quá trình đo
- Do số 2, nó xử lý các thay đổi về chiều rộng hoặc số lượng vật phẩm một cách chính xác mà không cần bất kỳ mã bổ sung nào
Mặt khác, bạn có thể lập luận rằng việc làm này dựa vào hành vi không có giấy tờ trong SDK có thể thay đổi. Mặt khác, bạn có thể lập luận rằng đây là cách quấn_content thực sự hoạt động với ListView và hành vi quấn_content hiện tại bị phá vỡ.
Nếu bạn lo lắng rằng hành vi có thể thay đổi trong tương lai, bạn chỉ cần sao chép chức năng onMeasure và các chức năng liên quan ra khỏi ListView.java và vào lớp con của riêng bạn, sau đó tạo đường dẫn AT_MOST thông qua onMeasure để chạy UNSPECifyED.
Nhân tiện, tôi tin rằng đây là một cách tiếp cận hoàn toàn hợp lệ khi bạn đang làm việc với một số lượng nhỏ các mục danh sách. Nó có thể không hiệu quả khi so sánh với linearLayout, nhưng khi số lượng vật phẩm ít, sử dụng linearLayout là tối ưu hóa không cần thiết và do đó độ phức tạp không cần thiết.