java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.widget.AdapterView
需求一:动态设置ListView和GridView高度
场景1:有时我们不想写一个固定高度让其滚动,而想根据子项的数目自动适配控件的高度。
场景2:两个滚动控件互相嵌套。由于嵌套后计算listview的高度出现问题导致的。比如在ScrollView中嵌套ListView空间,无法正确的计算ListView的大小,所以你们就只看到一行。
- 算法分析
- ListView
要计算ListView的高度,很简单啊。首先,得知道有多少条数据,循环计算每一条item的高度,把他们相加就得出了总的高度。
```
//为listview动态设置高度(有多少条目就显示多少条目)
public void setListViewHeight(ListView listView) {
//获取listView的adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
int totalHeight = 0;
//listAdapter.getCount()返回数据项的数目
for (int i = 0,len = listAdapter.getCount(); i < len; i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter .getCount() - 1));
listView.setLayoutParams(params);
}
//使用方式,必须刷新Adapter
setListViewHeight(listView);
listViewAdapter.notifyDataSetChanged();
```
- GridView
要计算GridView的高度,方法类似,只不过要考虑到列数。比如有12条数据,设置为5列,那么就有三行数据。只要我们得到每一行的高度,然后再相加,就是我们想要的结果。
```
public void setGridViewHeight(GridView gridview) {
// 获取gridview的adapter
ListAdapter listAdapter = gridview.getAdapter();
if (listAdapter == null) {
return;
}
// 固定列宽,有多少列
int numColumns= gridview.getNumColumns(); //5
int totalHeight = 0;
// 计算每一列的高度之和
for (int i = 0; i < listAdapter.getCount(); i += numColumns) {
// 获取gridview的每一个item
View listItem = listAdapter.getView(i, null, gridview);
listItem.measure(0, 0);
// 获取item的高度和
totalHeight += listItem.getMeasuredHeight();
}
// 获取gridview的布局参数
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight;
gridview.setLayoutParams(params);
}
//使用方式,必须刷新Adapter
setGridViewHeight(gridView);
gridViewAdapter.notifyDataSetChanged();
```