zoukankan      html  css  js  c++  java
  • android ScrollView中嵌套GridView,ListView只显示一行的解决办法

    注:本文是由网上大神分享的解决方案汇集而成

    方法一:

    重写ListView、GridView:

    重写ListView:

     1 public class MyListView extends ListView {
     2 
     3     public MyListView(Context context) {
     4         // TODO Auto-generated method stub
     5         super(context);
     6     }
     7 
     8     public MyListView(Context context, AttributeSet attrs) {
     9         // TODO Auto-generated method stub
    10         super(context, attrs);
    11     }
    12 
    13     public MyListView(Context context, AttributeSet attrs, int defStyle) {
    14         // TODO Auto-generated method stub
    15         super(context, attrs, defStyle);
    16     }
    17 
    18     @Override
    19     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    20         // TODO Auto-generated method stub
    21         int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
    22                 MeasureSpec.AT_MOST);
    23         super.onMeasure(widthMeasureSpec, expandSpec);
    24     }
    25 }

    重写GridView:

     1 /**
     2  * 自定义gridview,解决ListView中嵌套gridview显示不正常的问题(1行半)
     3  * @author wangyx
     4  * @version 1.0.0 2012-9-14
     5  */
     6 public class MyGridView extends GridView{
     7       public MyGridView(Context context, AttributeSet attrs) { 
     8             super(context, attrs); 
     9         } 
    10      
    11         public MyGridView(Context context) { 
    12             super(context); 
    13         } 
    14      
    15         public MyGridView(Context context, AttributeSet attrs, int defStyle) { 
    16             super(context, attrs, defStyle); 
    17         } 
    18      
    19         @Override 
    20         public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    21      
    22             int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, 
    23                     MeasureSpec.AT_MOST); 
    24             super.onMeasure(widthMeasureSpec, expandSpec); 
    25         } 
    26 }

    xml中的布局:

    <com.xxx.MyGridView 
                 android:id="@+id/mygridview" 
                 android:layout_width="fill_parent" 
                 android:layout_height="wrap_content" 
                 android:gravity="center" 
                 android:horizontalSpacing="5dp" 
                 android:numColumns="4" 
                 android:stretchMode="columnWidth" 
                 android:verticalSpacing="6dp"
    android:visibility="gone" />

    此方案亲测有效。

    PS:没有添加 android:visibility="gone"时,会出现一种bug,当ScrollView包含的内容很多,而GridView部分没有在"最最顶部面显示",GridView会默认强行获取焦点显示,而导致整个页面出现一种上移的情况。

    方法二:通过计算出来ListView或者GridView中的子列高度和 进行显示:

    public void setListViewHeightBasedOnChildren(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));  
        ((MarginLayoutParams)params).setMargins(10, 10, 10, 10);
        listView.setLayoutParams(params);  
    } 

    此方案,测试过同样可以达到效果。

  • 相关阅读:
    数据库三大范式讲解
    transition、-moz-transition、-webkit-transition、-o-transition是什么意思?怎样用?
    js常用函数
    margin()与offset()的区别
    小总结 小理解 (不咋全面...)
    栈的C++实现(指针)——创建-push-pop-top-清空栈-处理栈
    链表的C++实现——创建-插入-删除-输出-清空
    运行时间中的对数
    最大子序列和
    mapminmax的用法详解 _MATLAB
  • 原文地址:https://www.cnblogs.com/ws5861/p/3715620.html
Copyright © 2011-2022 走看看