转载自:http://www.2cto.com/kf/201210/159540.html
ListView或者GridView嵌套在ScrollView中:嵌套使用时,会出现ListView/GridView有自己的滚动条,而ScrollView又有自己的滚动条。解决此问题的核心是:重写ListView/GridView的OnMesure方法。
MyGridView.java代码如下:
package com.csdn.blog.scrollview;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView;
public class MyGridView extends GridView{
public MyGridView(Context context, AttributeSet attrs, intdefStyle) {
super(context, attrs,defStyle);
}
public MyGridView(Context context, AttributeSet attrs){
super(context, attrs);
}
public MyGridView(Context context) {
super(context);
}
@Override
protected void onMeasure(int widthMeasureSpec, intheightMeasureSpec) {
int expandSpec =MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec,expandSpec);
}
}
main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#FFFFFF">
<ScrollView
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:fadingEdgeLength="0dp"
android:scrollbars="none"
android:id="@+id/scroll">
<LinearLayout
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/image"
android:layout_height="150dp"
android:layout_width="fill_parent"
android:padding="2dp"
android:scaleType="centerCrop"
android:src="@drawable/fruit" />
<com.csdn.blog.scrollview.MyGridView
android:layout_marginTop="10dp"
android:id="@+id/grid"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:fadingEdgeLength="0dp"
android:scrollbars="none"
android:numColumns="3" />
</LinearLayout>
</ScrollView>
</LinearLayout>
主类主要就是GridVIew数据绑定。简单贴下代码:
package com.csdn.blog.scrollview;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
public class BlogScrollViewActivity extends Activity {
/** Called when the activity is first created. */
MyGridView grid;
ImageView image;
ScrollView scroll;
String[] texts=new String[]{"无线","通话设置","声音","显示","位置","应用","账户","隐私权","存储","语言","游戏","娱乐","电影","音乐","辅助功能","日期"};
ArrayAdapter<String> adapter;
LinearLayout.LayoutParams lp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
void init(){
image=(ImageView)findViewById(R.id.image);
grid=(MyGridView)findViewById(R.id.grid);
grid.setAdapter(newGridAdapter(this));
scroll=(ScrollView)findViewById(R.id.scroll);
scroll.requestChildFocus(image,null);
}
private class GridAdapter extends BaseAdapter{
Activity context;
public GridAdapter(Activitycontext){
this.context=context;
}
@Override
public int getCount() {
returntexts.length;
}
@Override
public Object getItem(int position){
returnnull;
}
@Override
public long getItemId(int position){
return 0;
}
@Override
public View getView(int position, View convertView,ViewGroup parent) {
ViewHolderholder=null;
if(convertView==null){
convertView=context.getLayoutInflater().inflate(R.layout.item,null);
holder=new ViewHolder();
holder.image=(ImageView)convertView.findViewById(R.id.grid_image);
holder.text=(TextView)convertView.findViewById(R.id.grid_text);
convertView.setTag(holder);
}
else{
holder=(ViewHolder)convertView.getTag();
}
holder.image.setImageResource(R.drawable.meinv);
holder.text.setText(texts[position]);
returnconvertView;
}
class ViewHolder {
ImageViewimage;
TextViewtext;
}
}
}
上述代码中 scroll.requestChildFocus(image, null); 此句主要是修复了程序进入时GridView会滑动到顶端的小bug。