解决:ScrollView嵌套ListView导致无法正确计算ListView的高度之动态加载图片高度常规方法失效。

本文介绍了解决嵌套在ScrollView中的ListView高度计算不准确的问题。通过调整ListView高度计算时机及使用特定方法,确保了ListView能够正确展示所有内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上述问题很多人都遇到过。相信很多人都用过网络常见的解决方法 ,即重写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的其他参数详解请自行百度

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值