天天看点

Android的GridView和ScrollView的嵌套

1、布局文件如下

文件名:testxm.xml

[html] view plain copy

Android的GridView和ScrollView的嵌套
Android的GridView和ScrollView的嵌套
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:background="#f1f1f1"  
  6.     android:orientation="vertical" >  
  7.     <!-- 顶部蓝色工具栏 -->  
  8.     <RelativeLayout  
  9.         android:id="@+id/fujin_top_llayout"  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="36dp"  
  12.         android:background="#47a9d0"  
  13.         android:gravity="center_vertical"  
  14.         android:orientation="horizontal" >  
  15.         <TextView  
  16.             android:id="@+id/fujin_top_llayout_lessthan"  
  17.             android:layout_width="wrap_content"  
  18.             android:layout_height="30dp"  
  19.             android:layout_alignParentLeft="true"  
  20.             android:layout_marginLeft="10dip"  
  21.             android:paddingLeft="10dp"  
  22.             android:text="1111" />  
  23.         <TextView  
  24.             android:id="@+id/fujin_top_llayout_fujin"  
  25.             android:layout_width="wrap_content"  
  26.             android:layout_height="30dp"  
  27.             android:layout_toRightOf="@+id/fujin_top_llayout_lessthan"  
  28.             android:paddingLeft="10dp"  
  29.             android:paddingTop="3dp"  
  30.             android:text="222"  
  31.             android:textColor="#fff"  
  32.             android:textSize="16sp" />  
  33.         <TextView  
  34.             android:id="@+id/fujin_top_llayout_dingwei"  
  35.             android:layout_width="70dp"  
  36.             android:layout_height="30dp"  
  37.             android:layout_toLeftOf="@+id/fujin_top_llayout_search"  
  38.             android:text="33333" />  
  39.         <TextView  
  40.             android:id="@+id/fujin_top_llayout_search"  
  41.             android:layout_width="wrap_content"  
  42.             android:layout_height="30dp"  
  43.             android:layout_alignParentRight="true"  
  44.             android:paddingRight="12dp"  
  45.             android:text="44444"/>  
  46.     </RelativeLayout>  
  47.     <!-- 顶部蓝色工具栏结束 -->  
  48.     <ScrollView  
  49.         android:layout_width="match_parent"  
  50.         android:layout_height="wrap_content"  
  51.         android:fillViewport="true"  
  52.         android:layout_weight="1"  
  53.         android:scrollbars="vertical" >  
  54.         <LinearLayout  
  55.             android:layout_width="match_parent"  
  56.             android:layout_height="wrap_content"  
  57.             android:orientation="vertical" >  
  58.             <!-- title -->  
  59.             <RelativeLayout  
  60.                 android:id="@+id/fenlei_title_rl"  
  61.                 android:layout_width="match_parent"  
  62.                 android:layout_height="28dp"  
  63.                 android:layout_marginLeft="15dp"  
  64.                 android:layout_marginRight="15dp"  
  65.                 android:layout_marginTop="20dp" >  
  66.                 <TextView  
  67.                     android:id="@+id/fenlei_title_tv"  
  68.                     android:layout_width="match_parent"  
  69.                     android:layout_height="match_parent"  
  70.                     android:gravity="center"  
  71.                     android:text="标题"  
  72.                     android:textSize="15sp" />  
  73.             </RelativeLayout>  
  74.             <!-- title_over -->  
  75.             <!-- btnlist -->  
  76.             <LinearLayout  
  77.                 android:id="@+id/fujin_btnlist_tl"  
  78.                 android:layout_width="match_parent"  
  79.                 android:layout_height="wrap_content"  
  80.                 android:layout_marginTop="15dp"  
  81.                 android:orientation="vertical"  
  82.                 android:scrollbarAlwaysDrawVerticalTrack="true" >  
  83.             </LinearLayout>  
  84.             <!-- btnlist_over -->  
  85.         </LinearLayout>  
  86.     </ScrollView>  
  87. </LinearLayout>  

2、gridview的item布局文件 [html] view plain copy

Android的GridView和ScrollView的嵌套
Android的GridView和ScrollView的嵌套
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout   
  3.          xmlns:android="http://schemas.android.com/apk/res/android"   
  4.          android:layout_height="wrap_content"   
  5.          android:paddingBottom="4dip" android:layout_width="fill_parent">  
  6.          <TextView   
  7.                android:layout_width="wrap_content"   
  8.                android:layout_below="@+id/ItemImage"   
  9.                android:layout_height="wrap_content"   
  10.                android:text="TextView01"   
  11.                android:layout_centerHorizontal="true"   
  12.                android:id="@+id/ItemText">  
  13.          </TextView>  
  14. </RelativeLayout>  

3、activity代码 [java] view plain copy

Android的GridView和ScrollView的嵌套
Android的GridView和ScrollView的嵌套
  1. public class PorterDuffActivity extends Activity{  
  2.     private PorterCanvas mPorterCanvas = null;  
  3.     private GridView gridView;  
  4.     private LinearLayout ll;  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.testxm);  
  8.         this.addview();  
  9.     }  
  10.     private void addview(){  
  11.         for(int i=1; i<=35;i++){  
  12.             ll=(LinearLayout) findViewById(R.id.fujin_btnlist_tl);  
  13.             this.addTwoClassify(i);  
  14.         }  
  15.     }  
  16.     private void makeGridView(int num){  
  17.         ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>();    
  18.           for(int i=0;i<10;i++)    
  19.           {    
  20.             HashMap<String, Object> map = new HashMap<String, Object>();    
  21.             map.put("ItemText", num+"NO."+String.valueOf(i));//按序号做ItemText    
  22.             lstImageItem.add(map);    
  23.           }    
  24.           //生成适配器的ImageItem <====> 动态数组的元素,两者一一对应    
  25.           SimpleAdapter saImageItems = new SimpleAdapter(this, //没什么解释    
  26.                                                     lstImageItem,//数据来源     
  27.                                                     R.layout.gridview_item,//night_item的XML实现    
  28.                                                     //动态数组与ImageItem对应的子项            
  29.                                                     new String[] {"ItemText"},     
  30.                                                     //ImageItem的XML文件里面的一个ImageView,两个TextView ID    
  31.                                                     new int[] {R.id.ItemText});    
  32.           //添加并且显示    
  33.           gridView.setAdapter(saImageItems);    
  34.     }  
  35.     private void addTwoClassify(int i){  
  36.         gridView=new MyGridView(PorterDuffActivity.this);//注意这里使用的是MyGridView,如果使用GridView的话,只会显示一行多一点,第二行显示不完全,使用MyGridView的话,能够完全显示出来。commend by danielinbiti  
  37.         gridView.setVerticalSpacing(10);  
  38.         gridView.setHorizontalSpacing(15);  
  39.         gridView.setNumColumns(3);  
  40.         this.makeGridView(i);  
  41.         LinearLayout ll_two=new LinearLayout(PorterDuffActivity.this);  
  42.         ll_two.setPadding(10, 0, 0, 0);  
  43.         ll_two.addView(gridView,  
  44.                 new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));  
  45.         ll.addView(ll_two, new LinearLayout.LayoutParams(   
  46.                 LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));   
  47.     }  
  48. }  

4、MyGridView代码 [java] view plain copy

Android的GridView和ScrollView的嵌套
Android的GridView和ScrollView的嵌套
  1. public class MyGridView extends GridView{  
  2.      private boolean needScrollBar = false;   //设置是否有ScrollBar,当要在ScollView中显示时,应当设置为false。 否则为 true    
  3.         public MyGridView(Context context) {     
  4.             super(context);     
  5.         }     
  6.         public MyGridView(Context context, AttributeSet attrs) {     
  7.             super(context, attrs);     
  8.         }     
  9.         public MyGridView(Context context, AttributeSet attrs, int defStyle) {     
  10.             super(context, attrs, defStyle);     
  11.         }     
  12.         @Override     
  13.         protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {     
  14.             if (!needScrollBar) {     
  15.                 int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);     
  16.                 super.onMeasure(widthMeasureSpec, expandSpec);     
  17.             } else {     
  18.                 super.onMeasure(widthMeasureSpec, heightMeasureSpec);     
  19.             }     
  20.         }     
  21. }  

总结:

因为ScrollView和GridView有布局上的冲突,如果外层嵌套了ScrollView,则GridView如果不是指定固定高度,则无法显示完全。ListView也有该问题。

但其实针对这到题来说,我觉得使用LinearLayout等分方式的布局也是可以的,垂直布局往下添加就可以了,这样避免了与ScrollView的冲突。但主要因为GridView是封装好的组件,所以使用了GridView能够简化一部分工作,但也增加了布局刷新的负担(虽然一般可以不考虑)

转自:http://blog.csdn.net/danielinbiti/article/details/45956745