寫項目遇到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的上邊搜尋部分
這樣沖突就解決了
效果圖
ListView和ScrollView的沖突
原理和GridView相同 這裡就不再贅述
ps:上述中的
scrollView.requestChildFocus(searchLayout, null) 是把焦點給了搜尋框,防止GridView上來就獲得焦點,把搜尋框頂上去