• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    2年前 (2015-11-05)  Android |   抢沙发  26 
    文章评分 0 次,平均分 0.0

    由于listview,gridview都继承自Scrollview,两个Scrollview不能嵌套,所以在显示的时候会出现奇怪的高度问题。网上说了2种办法:一种是重写listview和gridview。不过这个方法有个问题,如果你的listview或者gridview设置了分割线高度。最后的计算结果会忽略掉分割线的高度,导致现实不全。
    第二种方法是写一个工具类对listview的高度进行重算,计算完设置listview的高度,这个方法试过可行,有把分割线也计算进去。不过网上都是 listview的计算。缺少gridview的,因此在这里补充上。由于gridview计算的高度不能直接根据数据总数,需要判断每行显示的个数。以 及最后一行是否全部显示。需要多几个判断。

    代码如下:
    计算listview高度的代码

    public static void setListViewHeightBasedOnChildren(ListView listView) {
                        // 获取ListView对应的Adapter
                        ListAdapter listAdapter = listView.getAdapter();
                        if (listAdapter == null) {
                                // pre-condition
                                return;
                        }
          
                        int totalHeight = 0;
                        for (int i = 0, len = listAdapter.getCount(); i < len; 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);
                }
    

    计算gridview高度的代码

    public static void setGridViewHeightBasedOnChildren(GridView gridView) {
                        // 获取GridView对应的Adapter
                        ListAdapter listAdapter = gridView.getAdapter();
                        if (listAdapter == null) {
                                return;
                        }
                        int rows;
                        int columns=0;
                        int horizontalBorderHeight=0;
                        Class<?> clazz=gridView.getClass();
                        try {
                                //利用反射,取得每行显示的个数
                                Field column=clazz.getDeclaredField("mRequestedNumColumns");
                                column.setAccessible(true);
                                columns=(Integer)column.get(gridView);
                                //利用反射,取得横向分割线高度
                                Field horizontalSpacing=clazz.getDeclaredField("mRequestedHorizontalSpacing");
                                horizontalSpacing.setAccessible(true);
                                horizontalBorderHeight=(Integer)horizontalSpacing.get(gridView);
                        } catch (Exception e) {
                                // TODO: handle exception
                                e.printStackTrace();
                        }
                        //判断数据总数除以每行个数是否整除。不能整除代表有多余,需要加一行
                        if(listAdapter.getCount()%columns>0){
                                rows=listAdapter.getCount()/columns+1;
                        }else {
                                rows=listAdapter.getCount()/columns;
                        }
                        int totalHeight = 0;
                        for (int i = 0; i < rows; i++) { //只计算每项高度*行数
                                View listItem = listAdapter.getView(i, null, gridView);
                                listItem.measure(0, 0); // 计算子项View 的宽高
                                totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
                        }
                        ViewGroup.LayoutParams params = gridView.getLayoutParams();
                        params.height = totalHeight+horizontalBorderHeight*(rows-1);//最后加上分割线总高度
                        gridView.setLayoutParams(params);
                }
     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/4343.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享