关于android的ScrollView套listView展示不全的问题,目前网上都是提供setListViewHeightBasedOnChildren这个方法,方法如下:
public static void setListViewHeightBasedOnChildren( ListView listView ) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if( listAdapter == null ) {
return;
}
int totalHeight = 0;
for( int i = 0, len = listAdapter.getCount(); i < len; i++ ) { // listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView( i, null, listView );
listItem.measure( 0, 0 ); // 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + ( listView.getDividerHeight() * ( listAdapter.getCount() - 1 ) );
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams( params );
}
但这个方法有很大的问题,如果Item中有文本有多行的话,将也会出现展示不全。
解决方案如下,自定义一个listview
public class NoScrollListView extends ListView {
public NoScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >>2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, mExpandSpec);
}
}
<ScrollView
android:id="@+id/scrollview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#00000000" >
.....
<com.test.NoScrollListView
android:id="@+id/list_m1"
android:layout_width="fill_parent"
android:background="@android:color/transparent"
android:cacheColorHint="#00000000"
android:dividerHeight="0dp"
android:fadingEdge="none"
android:scrollingCache="false"
android:scrollbars="none"
android:visibility="gone"
android:layout_height="fill_parent"/ >
....