scrollview嵌套listView,造成ListView只显示一条的问题
方案一(不适用)
listview高度写死
如果将listView的高度设置为固定高度之后,条目虽然可以显示更多,但条目的数量是不定的,listview的高度也时随之动态变化的,所以不能写死。
方案二(有缺陷)
方法思路
遍历各个子条目的高度,进行相加,求得listview的总高度,然后进行设置。
举例代码
在我自定义的Adapter中加入setListViewHeightBasedOnChildren这个函数,然后在setAdapter之后调用此方法即可。
public class ECAdapter extends ArrayAdapter {
public ECAdapter(Context context, int resource, List<EC> objects) {
super(context, resource, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
EC ec = (EC)getItem(position);
View view = LayoutInflater.from(getContext()).inflate(R.layout.item_ec, null);
TextView partOfSpeech = (TextView)view.findViewById(R.id.item_ec_partofspeech);
TextView ecs = (TextView)view.findViewById(R.id.item_ec_ecs);
partOfSpeech.setText(ec.getPartOfSpeech());
ecs.setText(ec.getEcs());
return view;
}
/**
* 单词详情页面用了ScrollView
* 下面的函数解决ScrollView中嵌套ListView造成item只显示一个的问题
* @param listView
*/
public void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
int lastItemHeight = 0;
for (int i = 0, len = listAdapter.getCount(); i < len; i++) {
// listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
// 计算子项View 的宽高
listItem.measure(0, 0);
// 统计所有子项的总高度
totalHeight += listItem.getMeasuredHeight();
lastItemHeight = listItem.getMeasuredHeight();
}
totalHeight += lastItemHeight;
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() *(listAdapter.getCount() - 1));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}
}
方案三(暂未发现缺陷)
方案一遇到了一个问题,当listview中item的高度是(match content)由item中的内容(比如文字)决定时,getMeasureHeight不能获取动态的正确的高度
方法思路
新建一个ListViewEC继承ListView然后重写其中的onMeasure方法。
public class ListViewEC extends ListView {
public ListViewEC (Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int mExpandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, mExpandSpec);
}
}
参考
https://www.cnblogs.com/gdpdroid/p/6075126.html
https://blog.csdn.net/zz1667654468/article/details/83026319