ScrollView嵌套GridView

本文介绍了解决ScrollView嵌套GridView时常见的滚动冲突问题的方法。通过重写GridView的onMeasure方法,使得GridView能够在ScrollView中正常滚动,同时保持良好的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值