AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cctvjiatao.gridviewinscrollview"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="14" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
com.cctvjiatao.gridviewinscrollview.MainActivity.java
package com.cctvjiatao.gridviewinscrollview;
import android.app.Activity;
import android.os.Bundle;
import android.widget.GridView;
/**
* @作者: jiatao
* @修改时间:2016-3-17 上午10:15:25
* @包名:com.cctvjiatao.gridviewinscrollview
* @文件名:MainActivity.java
* @版权声明:www.cctvjiatao.com
* @功能: 在开发过程总遇到ScrollView嵌套GridView,由于这两种控件都带有滚动条,当他们碰到一起的时候便会出问题,问题是gridview不滚动,并且只显示两行.
* 从写GridView的onMeasure可以解决这个问题,实现GridView与ScrollView同时滚动,但是GridView性能降低了,如果加载过多,UI加载变的很卡。
*/
public class MainActivity extends Activity {
private GridView gv_vip;
// 图片
private int[] images = new int[] { R.drawable.grid_vip_1, R.drawable.grid_vip_2, R.drawable.grid_vip_3, R.drawable.grid_vip_4, R.drawable.grid_vip_5, R.drawable.grid_vip_6, R.drawable.grid_vip_7,
R.drawable.grid_vip_8 };
// 标题
private int[] titles = new int[] { R.string.grid_view_1_title, R.string.grid_view_2_title, R.string.grid_view_3_title, R.string.grid_view_4_title, R.string.grid_view_5_title,
R.string.grid_view_6_title, R.string.grid_view_7_title, R.string.grid_view_8_title };
// 说明
private int[] descs = new int[] { R.string.grid_view_1_desc, R.string.grid_view_2_desc, R.string.grid_view_3_desc, R.string.grid_view_4_desc, R.string.grid_view_5_desc, R.string.grid_view_6_desc,
R.string.grid_view_7_desc, R.string.grid_view_8_desc };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gv_vip = (GridView) findViewById(R.id.gv_vip);
ColorFlagVIPAdapter adapter = new ColorFlagVIPAdapter(this, images, titles, descs);
gv_vip.setAdapter(adapter);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="none" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#ffffff"
android:orientation="vertical" >
<com.cctvjiatao.gridviewinscrollview.MyGridVeiw
android:id="@+id/gv_vip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:numColumns="2"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:verticalSpacing="24dp" />
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:layout_marginTop="20dp"
android:background="@drawable/dotted_line" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="center"
android:text="@string/vip_open_title"
android:textColor="#333333"
android:textSize="14sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:gravity="center"
android:text="@string/vip_open_desc1"
android:textColor="#999999"
android:textSize="14sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginTop="6dp"
android:gravity="center"
android:text="@string/vip_open_desc2"
android:textColor="#999999"
android:textSize="14sp" />
</LinearLayout>
</ScrollView>
com.cctvjiatao.gridviewinscrollview.MyGridVeiw.java
package com.cctvjiatao.gridviewinscrollview;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.GridView;
/**
* @作者: jiatao
* @修改时间:2016-3-17 上午10:10:27
* @文件名:MyGridVeiw.java
* @版权声明:www.cctvjiatao.com
* @功能:
* 该自定义GridView只是重写了GridView的onMeasure方法,使其不会出现滚动条;ScrollView嵌套ListView也是同样的道理
* ,不再赘述.
*/
public class MyGridVeiw extends GridView {
public MyGridVeiw(Context context) {
super(context);
}
public MyGridVeiw(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyGridVeiw(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 重写onMeasure方法,重写后GridView即可以嵌套到ScrollView里面
*/
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
com.cctvjiatao.gridviewinscrollview.ColorFlagVIPAdapter.java
package com.cctvjiatao.gridviewinscrollview;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
/**
* @作者: jiatao
* @修改时间:2016-3-15 上午9:48:10
* @文件名:ColorFlagVIPAdapter.java
* @版权声明:www.cctvjiatao.com
* @功能:GridView的适配器
*/
public class ColorFlagVIPAdapter extends BaseAdapter {
private Context mContext;
private LayoutInflater mLayoutInflater;
private int[] images, titles, descs;
public ColorFlagVIPAdapter(Context mContext, int[] images, int[] titles, int[] descs) {
super();
this.mLayoutInflater = LayoutInflater.from(mContext);
this.mContext = mContext;
this.images = images;
this.titles = titles;
this.descs = descs;
}
@Override
public int getCount() {
return images.length;
}
@Override
public Object getItem(int position) {
return images[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mLayoutInflater.inflate(R.layout.item_grid_vip, parent, false);
holder = new ViewHolder();
holder.iv_pic = (ImageView) convertView.findViewById(R.id.iv_pic);
holder.tv_title = (TextView) convertView.findViewById(R.id.tv_title);
holder.tv_desc = (TextView) convertView.findViewById(R.id.tv_desc);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (images.length>0 && titles.length>0 && descs.length>0 ) {
holder.iv_pic.setImageResource(images[position]);//图标
holder.tv_title.setText(titles[position]);//标题
holder.tv_desc.setText(descs[position]);//说明
}
return convertView;
}
private final class ViewHolder {
TextView tv_title, tv_desc;//标题,说明
ImageView iv_pic;//头像
}
/**
* 重写BaseAdapter中的这个方法,使不可点击
*/
@Override
public boolean areAllItemsEnabled() {
return false;
}
/**
* 重写BaseAdapter中的这个方法,使不可点击
*/
@Override
public boolean isEnabled(int position) {
return false;
}
}
item_grid_vip.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_pic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@drawable/grid_vip_1"/>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_gravity="center"
android:gravity="center"
android:textSize="14dip"
android:textColor="#333333"
android:text="111111111"/>
<TextView
android:id="@+id/tv_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:layout_gravity="center"
android:gravity="center"
android:textSize="12dip"
android:textColor="#999999"
android:text="2222222"/>
</LinearLayout>