记录自己的每一个问题,也好让自己记住
实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView、GridView等等,都会有这样的问题
我们在用scrollview嵌套listview的时候必须得计算listview的高度,必须只能被布局包裹,否则的话就只能显示一行,所以得计算高度
计算高度的代码:
public static void setListViewHeight(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()过的适配器的item行数 View listItem = listAdapter.getView(i, null, listView); //计算子项View 的宽高 listItem.measure(0, 0); //统计所有子项的总高度 totalHeight += listItem.getMeasuredHeight(); } //获取listView布局参数 ViewGroup.LayoutParams params = listView.getLayoutParams(); //listView.getDividerHeight()获取子项间分隔符占用的高度 //params.height最后得到整个ListView完整显示需要的高度 params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); }
自定义一个类继承Listview,重写onMeasure方法
import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; /** * Created by renba on 2017/4/8. */ public class ListViewForScrollView extends ListView { public ListViewForScrollView(Context context) { super(context); } public ListViewForScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public ListViewForScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override /** * 重写该方法,达到使ListView适应ScrollView的效果 */ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }xml改成
<com.renbaojia.newcomers.ListViewForScrollView android:listSelector="@android:color/transparent" android:id="@+id/ssss" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none" />
使用前 使用后