15

Tôi cần đo tổng chiều cao của ListView nhưng dường như tôi liên tục nhận được các giá trị sai. Tôi đang sử dụng mã này:Android: Cách đo tổng chiều cao của ListView

public static void setListViewHeightBasedOnChildren(ListView listView) { 
    ListAdapter listAdapter = listView.getAdapter(); 
    if (listAdapter == null) { 
     return; 
    } 

    int totalHeight = 0; 
    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), 
      MeasureSpec.AT_MOST); 
    Log.w("DESIRED WIDTH", String.valueOf(listAdapter.getCount())); 
    for (int i = 0; i < listAdapter.getCount(); i++) { 
     View listItem = listAdapter.getView(i, null, listView); 
     listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 
     totalHeight += listItem.getMeasuredHeight(); 
     Log.w("HEIGHT"+i, String.valueOf(totalHeight)); 
    } 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight 
      + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 
} 

Vấn đề là tôi nhận được chiều cao lớn hơn tôi nên nhận. Mỗi mục danh sách được đo khác nhau và tất cả các mục có cùng chiều cao nên chắc chắn không nên làm điều đó. Chiều cao của mỗi phần tử ít nhất gấp đôi chiều cao thực của nó.

Cảm ơn bạn trước.

edit1:

Tôi có hai ListView và cả hai đều có các mục có 6-7 trường EditText. Tôi hiển thị/ẩn ListView nếu người dùng muốn viết/xóa các giá trị trong EditText. Tất cả mọi thứ hoạt động tốt trừ khi tôi muốn hiển thị danh sách, phải mất rất nhiều không gian vì phương pháp tính toán ListView cần rất nhiều không gian. Do đó tôi có rất nhiều không gian trống bên dưới ListView đó. Giống như không gian trống rỗng gấp ba lần cần thiết.

+1

http://stackoverflow.com/questions/2312683/calculate-the-size-of-a-list-view-or- làm thế nào để nói nó hoàn toàn mở rộng – RobinHood

+0

Cảm ơn bạn nhưng điều đó không hiệu quả với tôi. Tôi nghĩ rằng tôi có vấn đề này bởi vì tôi không có chỉ một ListView. Có thể có một số xung đột với vùng phủ sóng. – Cristiano

Trả lời

42

Cuối cùng tôi đã thực hiện nó! Đây là mã làm việc đo chiều cao ListView và đặt ListView ở kích thước đầy đủ:

public static void getTotalHeightofListView(ListView listView) { 

    ListAdapter mAdapter = listView.getAdapter(); 

    int totalHeight = 0; 

    for (int i = 0; i < mAdapter.getCount(); i++) { 
     View mView = mAdapter.getView(i, null, listView); 

     mView.measure(
       MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 

       MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 

     totalHeight += mView.getMeasuredHeight(); 
     Log.w("HEIGHT" + i, String.valueOf(totalHeight)); 

    } 

    ViewGroup.LayoutParams params = listView.getLayoutParams(); 
    params.height = totalHeight 
      + (listView.getDividerHeight() * (mAdapter.getCount() - 1)); 
    listView.setLayoutParams(params); 
    listView.requestLayout(); 

} 
+7

Bạn nên thay đổi tên của phương thức này. Bắt đầu với "get" ngụ ý một giá trị trả về không phải là void. –

+0

Ngoài ra, phương pháp này rất chậm để thực thi, tôi khuyên bạn chỉ nên chạy nó khi số lượng mục danh sách thay đổi. –

+4

Bạn cũng cần thêm 'listView.getPaddingTop()' và dưới cùng. – njzk2

0

ListView lưu trữ các mục xem và sử dụng lại chúng. Nếu bạn có chế độ xem danh sách với 1000 mục và chỉ có 6 mục hiển thị, tại sao, nó không đáng để hiển thị 994 không hiển thị.

Đo toàn bộ ListView có nghĩa là hiển thị mọi ListItem, có vẻ hơi quá mức.

Tôi không biết những gì bạn đang cố gắng để đạt được nhưng có lẽ là một cách tốt hơn :)

+0

Tôi không có nhiều mục :) Tôi có hai ListView và cả hai đều có các mục với 6-7 trường EditText. Tôi hiển thị/ẩn ListView nếu người dùng muốn viết/xóa các giá trị trong EditText. Tất cả mọi thứ hoạt động tốt trừ khi tôi muốn hiển thị danh sách, phải mất rất nhiều không gian vì phương pháp tính toán ListView cần rất nhiều không gian. Do đó tôi có rất nhiều không gian trống bên dưới ListView đó. Giống như không gian trống rỗng gấp ba lần cần thiết. – Cristiano

+0

Nhưng ListView không biết làm thế nào bạn sẽ sử dụng nó để nó được viết theo cách này. Nếu bạn muốn một trong những listview biến mất và giải phóng không gian trên màn hình cho danh sách khác để điền vào, sử dụng View.setVisibility (View.GONE) –

+0

Tôi đang sử dụng 'View.setVisibility (View.GONE)' nhưng khi Tôi cho thấy nó một lần nữa nó thực sự có rất nhiều không gian, toàn bộ màn hình của không gian trống rỗng. Tôi đang kiểm tra một liên kết mà @RobinHood đã đăng. Có vẻ như họ đã làm được điều đó bằng cách đo nó khác đi. – Cristiano

2

Hãy thử một cái gì đó như thế này:

listItem.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    public void onGlobalLayout() { 
    int listItemHeight = listItem.getHeight(); 
    } 
}); 

Nếu bạn muốn chiều cao của ListView sau đó thử này :

listView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

    public void onGlobalLayout() { 
    int listViewHeight = listView.getHeight(); 
    } 
}); 

Bạn cũng có thể kiểm tra điều này: Calculate the size of a list view or how to tell it to fully expand

+0

Cảm ơn bạn nhưng điều đó không hiệu quả với tôi. Tôi đã chỉnh sửa bài đăng đầu tiên. Tôi nghĩ rằng vấn đề là với nhiều danh sách. – Cristiano

+0

Nếu ai đó có danh sách chứa các mục có cùng chiều cao, thì tôi đoán đang làm list.LayoutParams = new LinearLayout.LayoutParams (fill_parent, thisFixedHeight * Count) là cách để đi. Không lặp lại bất kỳ đâu. Vấn đề thực sự là có một cái gì đó làm việc với danh sách các danh sách của danh sách. –