Android的GridView和ScrollView的嵌套,gridviewscrollview
來源於回答頻道答題,因此內容都是基於回答頻道的原題布局進行
1、布局檔案如下
檔案名稱:testxm.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f1f1f1" android:orientation="vertical" > <!-- 頂部藍色工具列 --> <RelativeLayout android:id="@+id/fujin_top_llayout" android:layout_width="fill_parent" android:layout_height="36dp" android:background="#47a9d0" android:gravity="center_vertical" android:orientation="horizontal" > <TextView android:id="@+id/fujin_top_llayout_lessthan" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_alignParentLeft="true" android:layout_marginLeft="10dip" android:paddingLeft="10dp" android:text="1111" /> <TextView android:id="@+id/fujin_top_llayout_fujin" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_toRightOf="@+id/fujin_top_llayout_lessthan" android:paddingLeft="10dp" android:paddingTop="3dp" android:text="222" android:textColor="#fff" android:textSize="16sp" /> <TextView android:id="@+id/fujin_top_llayout_dingwei" android:layout_width="70dp" android:layout_height="30dp" android:layout_toLeftOf="@+id/fujin_top_llayout_search" android:text="33333" /> <TextView android:id="@+id/fujin_top_llayout_search" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_alignParentRight="true" android:paddingRight="12dp" android:text="44444"/> </RelativeLayout> <!-- 頂部藍色工具列結束 --> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:fillViewport="true" android:layout_weight="1" android:scrollbars="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <!-- title --> <RelativeLayout android:id="@+id/fenlei_title_rl" android:layout_width="match_parent" android:layout_height="28dp" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:layout_marginTop="20dp" > <TextView android:id="@+id/fenlei_title_tv" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="標題" android:textSize="15sp" /> </RelativeLayout> <!-- title_over --> <!-- btnlist --> <LinearLayout android:id="@+id/fujin_btnlist_tl" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:orientation="vertical" android:scrollbarAlwaysDrawVerticalTrack="true" > </LinearLayout> <!-- btnlist_over --> </LinearLayout> </ScrollView></LinearLayout>
2、gridview的item布局檔案
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:paddingBottom="4dip" android:layout_width="fill_parent"> <TextView android:layout_width="wrap_content" android:layout_below="@+id/ItemImage" android:layout_height="wrap_content" android:text="TextView01" android:layout_centerHorizontal="true" android:id="@+id/ItemText"> </TextView></RelativeLayout>
3、activity代碼
public class PorterDuffActivity extends Activity{private PorterCanvas mPorterCanvas = null;private GridView gridView;private LinearLayout ll;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.testxm);this.addview();}private void addview(){ for(int i=1; i<=35;i++){ ll=(LinearLayout) findViewById(R.id.fujin_btnlist_tl); this.addTwoClassify(i); }}private void makeGridView(int num){ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>(); for(int i=0;i<10;i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemText", num+"NO."+String.valueOf(i));//按序號做ItemText lstImageItem.add(map); } //產生適配器的ImageItem <====> 動態數組的元素,兩者一一對應 SimpleAdapter saImageItems = new SimpleAdapter(this, //沒什麼解釋 lstImageItem,//資料來源 R.layout.gridview_item,//night_item的XML實現 //動態數組與ImageItem對應的子項 new String[] {"ItemText"}, //ImageItem的XML檔案裡面的一個ImageView,兩個TextView ID new int[] {R.id.ItemText}); //添加並且顯示 gridView.setAdapter(saImageItems); }private void addTwoClassify(int i){ gridView=new MyGridView(PorterDuffActivity.this);//注意這裡使用的是MyGridView,如果使用GridView的話,只會顯示一行多一點,第二行顯示不完全,使用MyGridView的話,能夠完全顯示出來。commend by danielinbiti gridView.setVerticalSpacing(10); gridView.setHorizontalSpacing(15); gridView.setNumColumns(3); this.makeGridView(i); LinearLayout ll_two=new LinearLayout(PorterDuffActivity.this); ll_two.setPadding(10, 0, 0, 0); ll_two.addView(gridView, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); ll.addView(ll_two, new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); }}
4、MyGridView代碼
public class MyGridView extends GridView{ private boolean needScrollBar = false; //設定是否有ScrollBar,當要在ScollView中顯示時,應當設定為false。 否則為 true public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (!needScrollBar) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } }
總結:
因為ScrollView和GridView有布局上的衝突,如果外層嵌套了ScrollView,則GridView如果不是指定固定高度,則無法顯示完全。ListView也有該問題。
但其實針對這到題來說,我覺得使用LinearLayout等分方式的布局也是可以的,垂直布局往下添加就可以了,這樣避免了與ScrollView的衝突。但主要因為GridView是封裝好的組件,所以使用了GridView能夠簡化一部分工作,但也增加了布局重新整理的負擔(雖然一般可以不考慮)