在开发中,会遇到这样的需求,整个列表上下滑动,里面有时可能会嵌套ListView或者GridView。
我使用的是PullToRefreshScrollView,这是一个库,里面有很多列表的控件。
在开发中会遇到如下两个问题:
1,ListView,GridView只显示一行。
2,ScrollView嵌套了ListView,GridView之后,进入的时候,显示的不是顶部。
针对以上两个问题,做出如下的解决方案:
1,重新计算ListView,GridView的高度。
/**
* 动态设置ListView的高度
*
* @param listView
*/
public void setListViewHeightBasedOnChildren(ListView listView) {
if (listView == null) return;
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
if (listAdapter.getCount() != 0) {
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
/**
* 动态设置GridView的高度
*
* @param listView
*/
public static void setListViewHeightBasedOnChildren(GridView listView) {
// 获取listview的adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}
// 固定列宽,有多少列
int col = 4;// listView.getNumColumns();
int totalHeight = 0;
// i每次加4,相当于listAdapter.getCount()小于等于4时 循环一次,计算一次item的高度,
// listAdapter.getCount()小于等于8时计算两次高度相加
for (int i = 0; i < listAdapter.getCount(); i += col) {
// 获取listview的每一个item
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
// 获取item的高度和
totalHeight += listItem.getMeasuredHeight();
}
// 获取listview的布局参数
ViewGroup.LayoutParams params = listView.getLayoutParams();
// 设置高度
params.height = totalHeight;
// 设置margin
((ViewGroup.MarginLayoutParams) params).setMargins(10, 10, 10, 10);
// 设置参数
listView.setLayoutParams(params);
}
以上方式即可解决ListView或者GridView只显示一行的问题。
2,设置
ScrollView.setFocusableInTouchMode(true);
lvHome.setFocusable(false);
以上方式即可解决所述问题