Как вычислить полные высоты строк 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.