本文共 2199 字,大约阅读时间需要 7 分钟。
在开发过程中,我们常需要将ListView与ScrollView嵌套使用。然而外层为ScrollView时,ListView上的item可能会出现显示异常:即使name列有多行项目,也只能显示一条。这一问题的成因主要是 ScrollView与ListView的焦点获取Conflict,所以我们需要采取特定措施进行修复。
当外层控件是ScrollView时,滚动动作优先由ListView处理,这会导致ListView在尝试滑动时与ScrollView发生Conflict。要解决这个问题,我们可以采取以下措施:
下面是直接可以复制并使用的完整代码实现:
package com.jgkj.bxxc.tools;import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.ListAdapter;import android.widget.ListView;public class Scroll_ListView_Conflict extends ListView { public Scroll_ListView_Conflict(Context context) { super(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } public static void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter != null) { int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { // 遍历所有子项 View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); // 测量子项的尺寸 totalHeight += listItem.getMeasuredHeight() + 45; // 总高度累加 } // 计算总高度并设定ListView参数 ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } }}
该代码实现了解决ListView与ScrollViewConflict的关键方法:
转载地址:http://taukk.baihongyu.com/