ScrollView中嵌套ListViewGridView导致的问题总结

    xiaoxiao2026-05-18  9

    界面打开时,scrollview不处于顶部。

    //由于焦点偏移的问题所导致 //只需要在layout的第一层布局中加入代码 android:focusableInTouchMode="true" android:focusable="true"

    ListView只显示一行或者显示不全

    这种情况需要做一些操作 推荐使用方法1,在方法1无效的情况下,可以在方法1的基础上使用方法2. 方法1.重写ListView/GridView(也可以用到ExpandableListView)

    /** * 自适应高度ListView */ public class AutoHeightListView extends ListView { public AutoHeightListView(Context context) { super(context); } public AutoHeightListView(Context context, AttributeSet attrs) { super(context, attrs); } public AutoHeightListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } } /** * 自适应高度GridView * 可以加多一个判断,如果scrollBar=none则为自适应,否则为普通GridView. */ public class AutoHeightGridView extends GridView { private boolean haveScrollbar = true; public AutoHeightGridView(Context context) { super(context); } public AutoHeightGridView(Context context, AttributeSet attrs) { super(context, attrs); } public AutoHeightGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * 判断是否有ScrollBar,none时设置为false,默认为true. */ public void setHaveScrollbar(boolean haveScrollbar) { this.haveScrollbar = haveScrollbar; } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }

    方法2.计算ListView高度,并修改。

    /** * 调整ListView的高度(所有item展开后的高度) * @param listView */ public static void turnListviewHeight(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } 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(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); } /** * 调整GridView的高度(所有item展开后的高度) * @param gridView */ public static void turnGridviewHeight(GridView gridView) { // 获取listview的adapter ListAdapter listAdapter = gridView.getAdapter(); if (listAdapter == null) { return; } // 固定列宽,有多少列 int col = gridView.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, gridView); listItem.measure(0, 0); // 获取item的高度和 totalHeight += listItem.getMeasuredHeight(); } // 获取listview的布局参数 ViewGroup.LayoutParams params = gridView.getLayoutParams(); // 设置高度 params.height = totalHeight; // 设置margin ((ViewGroup.MarginLayoutParams) params).setMargins(10, 10, 10, 10); // 设置参数 gridView.setLayoutParams(params); }
    转载请注明原文地址: https://ju.6miu.com/read-1309817.html
    最新回复(0)