上述问题很多人都遇到过。相信很多人都用过网络常见的解决方法 ,即重写ListVIew的onMeasure方法。这种方式可以禁止ListView响应滑动事件
并且还能让ListView正确计算高度。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
而我的ListView布局是
这种情况下上面的方法就失效了,因为ImageView的高度是动态设置的。也就是在Adapter中进行的。ListView就无法正确的计算高度了。
于是我又用了下面的代码来手动计算ListView的高度。
/**
* 解决ScrollView嵌套listView导致Listview无法正常显示的问题
*/
public static void setListViewHeight(ListView listView){
ListAdapter listAdapter = listView.getAdapter();
if(listAdapter == null) {
return;
}
int totalHeight = 0;
for(int i = 0;i< listAdapter.getCount();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);
}
我在ListView.setAdapter()之后调用的,ListView仍然无法正确计算高度。有时候底部会多一块空白,有时候最后一个item没显示全。很是蛋疼。
在查了很多资料后,我猜想可能是因为ListView的高度是在ImageView的高度确定之前就已经被设置了。从而导致了Listview的高度无法正确计算。
于是我将setListViewHeight这个方法的调用放在了。adapter.notifyDataSetChanged();之后,一运行。发现问题解决了。
我想问题应该就是出现在计算ListView高度的时机上了。
最后贴出用到的几个方法。
一:因为我的item中包含ImageView和TextView。而且ImageView的高度是自适应图片的
因此我计算了Imageview
/**
* @param activity
* @param view
* @param heightProportion 高度比例
* @param widthProportion 宽度
* @param heightMargin 图片间距 这两个参数是为了在GridView这类一行有多个图片且有间距的时候用的
* @param widthMargin 图片间距
*/
public static void autoSetViewHeight(Activity activity, ImageView view, int heightProportion, int widthProportion, int heightMargin, int widthMargin){
DPIUtil.getScreenMetrics(activity);
//屏幕的宽高。
int screenWidth = (int) DPIUtil.screen_width;
int screenHeight = (int) DPIUtil.screen_height;
ViewGroup.LayoutParams lp = view.getLayoutParams();
lp.width = RelativeLayout.LayoutParams.MATCH_PARENT;
lp.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
view.setLayoutParams(lp);
view.setMaxWidth((screenWidth-widthMargin)/widthProportion);
view.setMaxHeight((screenHeight-heightMargin)/heightProportion);
}
ImageView的XML
<ImageView android:id="@+id/goddess_details_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitXY" />
通过以上方式成功解决了ListView高度的问题。记录下来以后再遇上这种问题就不用到处找了。
如果用上述的方式加载后出现了图片变形的问题。那么可以通过修改scaleType的参数来修复问题。一般情况下centerCrop就足够了。scaleType的其他参数详解请自行百度