Я реализовал это следующим образом (код находится в стадии разработки, поэтому это скорее источник идеи, чем решение):
package com.customcontrols;
public class NoScrollListView extends ListView
{
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, 0) );
// here I assume that height's being calculated for one-child only, seen it in ListView's source which is actually a bad idea
int childHeight = getMeasuredHeight() - (getListPaddingTop() + getListPaddingBottom() + getVerticalFadingEdgeLength() * 2);
int fullHeight = getListPaddingTop() + getListPaddingBottom() + childHeight*(getCount());
setMeasuredDimension(getMeasuredWidth(), fullHeight);
}
}
расчет не идеален, но он близок и работает до сих пор.после этого вы просто создаете макет, подобный следующему:
ScrollView com.customcontrol.NoScrollListView com.customcontrol.NoScrollListView com.customcontrol.NoScrollListView / ScrollView
ScrollView очень важен, так как вы легко можете выйти изграницы экрана.
PS.Вычисление осуществляется на основе прямой кишки, поскольку большинство методов вычисления в ListView & Co являются пакетными, что является довольно странным выбором для общедоступных классов для пользовательского интерфейса.