(转)解决ScrollView嵌套ListView或者GridView导致只显示一行的方法

即动态获取ListView和GridView的高度

一、对于ListView

ListView listview= new ListView(this);

setListViewHeightBasedOnChildren(listview);即可

 1 public static void setListViewHeightBasedOnChildren(ListView listView) {
 2                     // 获取ListView对应的Adapter
 3                     ListAdapter listAdapter = listView.getAdapter();
 4                     if (listAdapter == null) {
 5                             // pre-condition
 6                             return;
 7                     }
 8
 9                     int totalHeight = 0;
10                     for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目
11                             View listItem = listAdapter.getView(i, null, listView);
12                             listItem.measure(0, 0); // 计算子项View 的宽高
13                             totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
14                     }
15
16                     ViewGroup.LayoutParams params = listView.getLayoutParams();
17                     params.height = totalHeight
18                                     + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
19                     // listView.getDividerHeight()获取子项间分隔符占用的高度
20                     // params.height最后得到整个ListView完整显示需要的高度
21                     listView.setLayoutParams(params);
22             }

二、对于GridView

GridView gridview = new GridView(this);

setGridViewHeightBasedOnChildren(gridview );即可

 1 public static void setGridViewHeightBasedOnChildren(GridView gridView) {
 2                     // 获取GridView对应的Adapter
 3                     ListAdapter listAdapter = gridView.getAdapter();
 4                     if (listAdapter == null) {
 5                             return;
 6                     }
 7                     int rows;
 8                     int columns=0;
 9                     int horizontalBorderHeight=0;
10                     Class<?> clazz=gridView.getClass();
11                     try {
12                             //利用反射,取得每行显示的个数
13                             Field column=clazz.getDeclaredField("mRequestedNumColumns");
14                             column.setAccessible(true);
15                             columns=(Integer)column.get(gridView);
16                             //利用反射,取得横向分割线高度
17                             Field horizontalSpacing=clazz.getDeclaredField("mRequestedHorizontalSpacing");
18                             horizontalSpacing.setAccessible(true);
19                             horizontalBorderHeight=(Integer)horizontalSpacing.get(gridView);
20                     } catch (Exception e) {
21                             // TODO: handle exception
22                             e.printStackTrace();
23                     }
24                     //判断数据总数除以每行个数是否整除。不能整除代表有多余,需要加一行
25                     if(listAdapter.getCount()%columns>0){
26                             rows=listAdapter.getCount()/columns+1;
27                     }else {
28                             rows=listAdapter.getCount()/columns;
29                     }
30                     int totalHeight = 0;
31                     for (int i = 0; i < rows; i++) { //只计算每项高度*行数
32                             View listItem = listAdapter.getView(i, null, gridView);
33                             listItem.measure(0, 0); // 计算子项View 的宽高
34                             totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
35                     }
36                     ViewGroup.LayoutParams params = gridView.getLayoutParams();
37                     params.height = totalHeight+horizontalBorderHeight*(rows-1);//最后加上分割线总高度
38                     gridView.setLayoutParams(params);
39             }
时间: 2024-12-26 11:19:52

(转)解决ScrollView嵌套ListView或者GridView导致只显示一行的方法的相关文章

android中ScrollView嵌套ListView或GridView显示位置问题

Android中ScrollView中嵌套ListView或GridView时在开始进入界面时总是显示中间位置,开头的位置显示不出来.这种情况下只需要在ScrollView的父控件中添加以下两行代码即可. 1 android:focusableInTouchMode="true" 2 android:focusable="true" 还有一个问题:在ScrollView嵌套ListView或GridView时仅仅显示一行或两行,ListView或GridView无法

一键解决ScrollView嵌套ListView仅仅显示一行的问题

/** * 解决ScrollView嵌套ListView仅仅显示一行的问题 * * @param listView */ private void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0;

ScrollView嵌套ListView、GridView只显示一行,psts显示不出来

我们经常会用到在ScrollView嵌套ListView.GridView,给layout_height设置wrap或者match的时候,结果只显示一行,而给它设置一个固定的高度虽然能显示出来,但是会显示不全,或者空出一段. 原因:ScrollView在计算高度的时候,如果是wrap或者是match就会出错,结果只显示一行. 解决方案:定义一个类GridView4ScrollView继承GridView,然后重写onMeasure方法 @Override /** * 重写该方法,重新计算Grid

一键解决ScrollView嵌套ListView只显示一行的问题

/** * 解决ScrollView嵌套ListView只显示一行的问题 * * @param listView */ private void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0;

ScrollView 嵌套ListView 滑动冲突,与显示不全

import android.content.Context; import android.util.AttributeSet; import android.widget.ListView; /** * * @author jiarh *2014-8-14 */ public class UserListView extends ListView { public UserListView(Context context) { super(context); } public UserLis

四种方案解决ScrollView嵌套ListView问题(转)

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S

四种方案解决ScrollView嵌套ListView问题

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S

四种方法解决scrollview嵌套listview,listview高度确定问题

以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表

四种方案解决ScrollView嵌套ListView问题 [复制链接]

以下文章转自@安卓泡面 在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表