Это мой калькулятор функций Высота ListView:
fun setListViewHeightBasedOnChildren(listView: ListView) {
val listAdapter = listView.getAdapter() ?: return
val desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED)
var totalHeight = 0
var view: View? = null
for (i in 0 until listAdapter.getCount()) {
view = listAdapter.getView(i, view, listView)
if (i == 0)
view!!.layoutParams = ViewGroup.LayoutParams(desiredWidth, LinearLayout.LayoutParams.WRAP_CONTENT)
view!!.measure(desiredWidth, MeasureSpec.UNSPECIFIED)
totalHeight += view.measuredHeight
}
val params = listView.getLayoutParams()
params.height = totalHeight + listView.getDividerHeight() * (listAdapter.getCount() - 1)
listView.setLayoutParams(params)
}
И вызываем display all items:
setListViewHeightBasedOnChildren(listView)
Результат: последняя строка не отображается нормально:

Почему высота ListView неверна?
проверьте ответ ниже:
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.AT_MOST);
Log.d("list", "" + listAdapter.getCount());
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
if (listItem != null) {
// This next line is needed before you call measure or else you won't get measured height at all. The listitem needs to be drawn first to know the height.
listItem.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
totalHeight += listItem.getMeasuredHeight();
Log.d("total height", "" + totalHeight);
}
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
Log.d("params height", "" + params.height);
listView.setLayoutParams(params);
listView.requestLayout();
возможно, вы забыли общее верхнее и нижнее заполнение и настройку параметров для элемента списка, как в приведенном выше коде.