天天看點

Android程式設計筆記 GridView、ListView和ScrollView的嵌套沖突

寫項目遇到GridView和上邊的一部分作為整體,能夠滿足上下滑動,我就自然地想到了ScrollView嵌套GridView,但測試的時候發現GridView顯示不全,很令人郁悶,上網查了查資料,發現這是ScrollView嵌套Gridview和Listview的通病,他們都帶有滾動條,高度計算就會出現錯誤,下面一起來讨論GridView、ListView和ScrollView的嵌套問題

解決的核心就是重寫GridView和ListView的onMeasure()方法

下面我們詳細地讨論 

GridView和ScrollView的嵌套沖突

簡單的就是自定義MyGridView 重寫onMeasure方法

public class MyGridView extends GridView{

	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) {
		int myMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2, MeasureSpec.AT_MOST);
		super.onMeasure(widthMeasureSpec, myMeasureSpec);
	}

}
           

XML代碼如下

<pre name="code" class="html"><ScrollView
        android:id="@+id/scrollview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true" >

        <RelativeLayout
            android:id="@+id/contentlayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <RelativeLayout
                android:id="@+id/lay_search"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/search_bj"
                android:gravity="center_vertical" >

                <ImageView
                    android:id="@+id/btn_search"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_margin="5dp"
                    android:background="@drawable/btn_search_seletor" />

                <EditText
                    android:id="@+id/et_search"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="5dp"
                    android:layout_toLeftOf="@id/btn_search"
                    android:background="@drawable/edit_text_bj" >

                    <requestFocus />
                </EditText>
            </RelativeLayout>

            <com.example.custom.MyGridView
                android:id="@+id/gridview"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@id/lay_search"
                android:numColumns="4"
                android:stretchMode="columnWidth"
                android:verticalSpacing="20dp" >
            </com.example.custom.MyGridView>
        </RelativeLayout>
    </ScrollView>
           

MainAty.java代碼如下

mGridView = (MyGridView) view.findViewById(R.id.gridview);
searchLayout = view.findViewById(R.id.lay_search);
imgs = new int[]{R.drawable.tu1,R.drawable.tu2,R.drawable.tu3,R.drawable.tu4,R.drawable.tu5,R.drawable.tu6,R.drawable.tu7,R.drawable.tu8,Rdrawable.tu11,R.drawable.tu9};
		ArrayList<HashMap<String, Object>> item = new ArrayList<HashMap<String,Object>>();
		for (int i = 0; i < 10; i++) {
			HashMap<String, Object> map = new HashMap<String, Object>();
			map.put("imgs", imgs[i]);
			item.add(map);
		}
		 
		SimpleAdapter adapter = new SimpleAdapter(getActivity(), item, R.layout.gridview_item, new String[]{"imgs"}, new int[]{R.id.img});
		mGridView.setAdapter(adapter);
	scrollView.requestChildFocus(searchLayout, null);//GridView的上邊搜尋部分
           

這樣沖突就解決了

效果圖

Android程式設計筆記 GridView、ListView和ScrollView的嵌套沖突

ListView和ScrollView的沖突

原理和GridView相同 這裡就不再贅述

ps:上述中的

scrollView.requestChildFocus(searchLayout, null) 是把焦點給了搜尋框,防止GridView上來就獲得焦點,把搜尋框頂上去

繼續閱讀