Как вычислить полные высоты строк listView в android?

Я использовал этот код, чтобы получить общую высоту элементов списка listview, но не вернул фактическую высоту. Вот использованный код

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

 int totalHeight = 0;
 for (int i = 0; i < listAdapter.getCount(); i++) {
 View listItem = listAdapter.getView(i, null, listView);
 listItem.measure(0, 0);
 totalHeight += listItem.getMeasuredHeight();
 }

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

Например: у меня есть listview с 20 строками, и высота каждой строки отличается от других, предположим, что 200 300 500. Когда я использую этот выше код, он не возвращает фактическую высоту для меня. Также я попробовал этот ответ: Android: как измерить общую высоту ListView, но не работает. Как я могу избавиться от этой проблемы. Может ли кто-нибудь объяснить это решение?

1 ответ

View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();

Ядром функции являются эти три строки, она пытается измерить каждый вид. 0 в listItem.measure(0, 0) равно MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)

В основном он будет вычислять точную высоту списка. Существует одно исключение, когда содержимое представления слишком велико и будет обертывать строку, т.е. Есть много строк текста. В такой ситуации вы должны указать точную widthSpec для измерения(). Поэтому измените listItem.measure(0, 0) на

// try to give a estimated width of listview
int listViewWidth = screenWidth - leftPadding - rightPadding; 
int widthSpec = MeasureSpec.makeMeasureSpec(listViewWidth, MeasureSpec.AT_MOST);
listItem.measure(listViewWidth, 0)

ОБНОВЛЕНИЕ о формуле здесь

int listViewWidth = screenWidth - leftPadding - rightPadding;

Это просто пример, показывающий, как вы можете оценить ширину ширины списка, формула основана на том, что width of listview ≈ width of screen. Отступы устанавливаются самим собой, может быть, 0 здесь. На этой странице показано, как получить ширину экрана. В общем, это просто образец, и вы можете написать свою собственную формулу здесь.

licensed under cc by-sa 3.0 with attribution.