ListView 中嵌套 GridView

1、主布局文件

<?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:background="#F5F5F5"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/lv_apply_classify"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:cacheColorHint="#00000000"
        android:dividerHeight="10dip"
         >
    </ListView>

</LinearLayout>

2、listview 对应的item

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/tv_apply_classify_name"
        android:layout_width="match_parent"
        android:layout_height="35dip"
        android:layout_marginLeft="10dip"
        android:layout_marginRight="10dip"
        android:gravity="center_vertical"
        android:singleLine="true"
        android:text="应用"
        android:textSize="@dimen/font_body_16"
        android:textColor="@color/black" />

    <com.example.view.ClassifyGridView
        android:id="@+id/gv_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dip"
        android:layout_marginRight="5dip"
        android:layout_marginTop="5dp"
        android:horizontalSpacing="1dip"
        android:numColumns="2"
        android:verticalSpacing="1dip" >
    </com.<span style="font-family: Arial, Helvetica, sans-serif;">exaple</span><span style="font-family: Arial, Helvetica, sans-serif;">.ClassifyGridView></span>

</LinearLayout>

3、gridview对应的item

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/lv_item_selector"
    android:orientation="vertical"
    android:padding="5dip" >

    <TextView
        android:id="@+id/tv_apply_name"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="5dip"
        android:singleLine="true"
        android:text="应用"
        android:textSize="@dimen/font_body_16"
        android:textColor="@color/black" />

    <TextView
        android:id="@+id/tv_description_name"
        android:layout_width="120dip"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="5dip"
        android:maxLines="2"
         android:textSize="@dimen/font_body_14"
        android:text="应用 描述"
        android:textColor="@color/gray" />

</LinearLayout>

4、主Activity

public class ClassifyActivity extends Activity {

	private ListView mListView;
	private ClassifyListViewAdapter mListViewAdapter;
	private List<ApplyTest> mArrayList;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.apply_main_classify);
		init();
	}

	private void init() {
		mListView = (ListView) findViewById(R.id.lv_apply_classify);
		initData();
		mListViewAdapter = new ClassifyListViewAdapter(mArrayList,
				ClassifyActivity.this);
		mListView.setAdapter(mListViewAdapter);
	}

	private void initData() {
		mArrayList = new ArrayList<ApplyTest>();

		for (int i = 0; i < 2; i++) {
			ApplyTest testApplyTest = new ApplyTest();
			testApplyTest.setName("测试分类"+i);
			List<ApplySub> arrayListForEveryGridView = new ArrayList<ApplySub>();
			for (int j = 0; j < 4; j++) {
				ApplySub sub = new ApplySub();
				sub.setName("子项"+i+j);
				arrayListForEveryGridView.add(sub);
			}
			testApplyTest.setSubs(arrayListForEveryGridView);
			mArrayList.add(testApplyTest);
		}

	}

	public class ApplyTest {
		private String name;
		private List<ApplySub> subs;

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public List<ApplySub> getSubs() {
			return subs;
		}

		public void setSubs(List<ApplySub> subs) {
			this.subs = subs;
		}

	}

	public class ApplySub {
		private String id;
		private String name;

		public String getId() {
			return id;
		}

		public void setId(String id) {
			this.id = id;
		}

		public String getName() {
			return name;
		}

		public void setName(String name) {
			this.name = name;
		}

	}
}

5、listview适配器

public class ClassifyListViewAdapter extends BaseAdapter {
	private List<ApplyTest> mList;
	private Context mContext;

	public ClassifyListViewAdapter(List<ApplyTest> mList,
			Context mContext) {
		super();
		this.mList = mList;
		this.mContext = mContext;
	}

	@Override
	public int getCount() {
		if (mList == null) {
			return 0;
		} else {
			return this.mList.size();
		}
	}

	@Override
	public Object getItem(int position) {
		if (mList == null) {
			return null;
		} else {
			return this.mList.get(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) {
			holder = new ViewHolder();
			convertView = LayoutInflater.from(this.mContext).inflate(R.layout.apply_main_classify_gv, null);
			holder.gridView = (GridView) convertView.findViewById(R.id.gv_toolbar);
			holder.tv_apply_classify_name = (TextView) convertView.findViewById(R.id.tv_apply_classify_name);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}

		if (this.mList != null) {
			if (holder.gridView != null) {
				ApplyTest mApplyTest = this.mList.get(position);
				ClassifyGridViewAdapter gridViewAdapter = new ClassifyGridViewAdapter(mContext,mApplyTest.getSubs());
				holder.gridView.setAdapter(gridViewAdapter);
				holder.tv_apply_classify_name.setText("分类"+position+mApplyTest.getName());
			}
		}
		return convertView;
	}

	private class ViewHolder {
		GridView gridView;
		public TextView tv_apply_classify_name;
	}
}

6、gridview 适配器

public class ClassifyGridViewAdapter extends BaseAdapter {
	private Context mContext;
	private List<ApplySub> mList;

	public ClassifyGridViewAdapter(Context mContext,
			List<ApplySub> mList) {
		super();
		this.mContext = mContext;
		this.mList = mList;
	}

	@Override
	public int getCount() {
		if (mList == null) {
			return 0;
		} else {
			return this.mList.size();
		}
	}

	@Override
	public Object getItem(int position) {
		if (mList == null) {
			return null;
		} else {
			return this.mList.get(position);
		}
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		ViewHolder holder = null;
		if (convertView == null) {
			holder = new ViewHolder();
			convertView = LayoutInflater.from(this.mContext).inflate(R.layout.apply_main_classify_group, null);
			holder.tv_apply_name = (TextView) convertView.findViewById(R.id.tv_apply_name);
			holder.tv_description_name = (TextView) convertView.findViewById(R.id.tv_description_name);
			holder.iv_apply_classify_icon =  (RemoteImageView) convertView.findViewById(R.id.iv_apply_classify_icon);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}

		if (this.mList != null) {
			ApplySub sApplySub = this.mList.get(position);
			if (holder.tv_apply_name != null) {
				holder.tv_apply_name.setText(sApplySub.getName());
//				holder.tv_description_name.setText(hashMap.get("content").toString());
				holder.tv_apply_name.setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View v) {
						Toast.makeText(mContext, "第" + (position + 1) + "个",
								Toast.LENGTH_SHORT).show();
					}
				});
			}
		}
		return convertView;
	}

	private class ViewHolder {
		TextView tv_apply_name;
		TextView tv_description_name;
	}
}

7、重写gridview让其不滚动

public class ClassifyGridView extends GridView {

	public ClassifyGridView(android.content.Context context,android.util.AttributeSet attrs) {
		super(context, attrs);
	}

	/**
	 * 设置不滚动
	 */
	public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
				MeasureSpec.AT_MOST);
		super.onMeasure(widthMeasureSpec, expandSpec);

	}

}
时间: 2024-10-11 12:41:54

ListView 中嵌套 GridView的相关文章

ListView中嵌套GridView显示不全的解决方法

项目需要,在ListView中显示多张图片,用到了GridView,不过如果使用普通的GridView,Item仅仅只是显示一部分,超出第一行以后的都无法显示了,这个很无语,所以又得继承下GridView重写onMeasure方法去测量子控件的宽高了.. 这里只是贴出自定义GridView的代码,直接在xml中使用,ListView的Adapter中调用即可: public class GridViewForListView extends GridView { public GridViewF

ListView中嵌套GridView时GridView的数据无法完全显示,只显示一行

这种情况下需要自定义一个GridView,然后重写GridView的onMeasure(int widthMeasureSpec, int heightMeasureSpec)的方法,将GridView重新测量,并且指定GridView的新的高度 package com.yuedong.mobi.view; import android.content.Context; import android.util.AttributeSet; import android.widget.GridVie

android ScrollView中嵌套GridView,ListView只显示一行的解决办法

注:本文是由网上大神分享的解决方案汇集而成 方法一: 重写ListView.GridView: 重写ListView: 1 public class MyListView extends ListView { 2 3 public MyListView(Context context) { 4 // TODO Auto-generated method stub 5 super(context); 6 } 7 8 public MyListView(Context context, Attrib

ScrollView中嵌套GridView,Listview的办法

按照android的标准,ScrollView中是不能嵌套具有滑动特性的View的,但是有时如果设计真的有这样做的需要,或者为了更方便简单的实现外观(比如在外在的大布局需要有滑动的特性,并且内部有类似于List的UI结构,那么ListView + Adpater的方式来实现里面的效果就很方便,算是违规抄近道的一种方式吧),有时就会不得不采用这种怪异的组合方式. 先说下这种方式如果不做特殊处理时会出现的冲突和问题: 1,在SrollView中嵌套ListView,ListView的显示会有问题,只

解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题

在一个滑动控件或者是布局里面,添加另外一个可以滑动的控件,通常会造成一些莫名其妙的问题.今天主要介绍在工作中遇到的,在ScrollView布局中嵌套Listview显示不正常,和在Listview中嵌套Listview的滑动冲突的问题. 1.ScrollView布局中嵌套Listview显示不正常的解决方案 目前来说,解决这个问题有好几种解决方案,这里只介绍其中两种比较简单易行的其中两种. (1)自定义一个Listview,继承自Listview,代码如下: public class ListV

ScrollView中嵌套GridView,ListView只显示一行的解决办法

转载:http://blog.csdn.net/luohai859/article/details/39347583 关于为什么只显示一行,个人理解是:如果单独使用GridView和ListView,里面的内容是固定的,底层系统很容易计算出控件要占用的宽高,当外面嵌套一层ScrollView后,就能做上下或左右滑动,但能滑动多少系统不知道,这时就需要你给计算出一个滑动区域给ScrollView.而这个数值就是通过GridView和ListView中的内容总的宽高之和.有更精确的理解欢迎赐教.解决

android 之 ListView 里面嵌套 GridView 遇到的问题及其解决方法。

我们直接入主题.所有问题例子请参照下图 1,怎样使图片具有点击事件? 答: 解决方法: 在你的BaseAdapter里面不要设置下面这三个东西,然后再设置GridView的onItemClick. gridView.setClickable(false); gridView.setPressed(false); gridView.setEnabled(false); 2,为什么我在已经处理了listView点击事件阻断的情况下,同时图片具有点击事件,此时再点击和图片同高度的空白处,却无法执行li

ListView 里面嵌套 GridView 遇到的问题及其解决方法。

我们直接入主题.所有问题例子请参照下图 1,怎样使图片具有点击事件? 答: 解决方法: 在你的BaseAdapter里面不要设置下面这三个东西,然后再设置GridView的onItemClick. gridView.setClickable(false); gridView.setPressed(false); gridView.setEnabled(false); 2,为什么我在已经处理了listView点击事件阻断的情况下,同时图片具有点击事件,此时再点击和图片同高度的空白处,却无法执行li

ListView中镶嵌GridView实现时间线功能问题总汇

看了网上的时间线,基本都非常的差劲,不如自己写一个,实现的效果如下,在实现的过程中遇到了2个大的问题:1.gridView显示不全2.listview的item不可点击,那么下面写出我解决这两个问题的办法 一.GridView显示不全的问题 GridView 显示不全是因为ListView和GridView都是可以滚动的,在android中不可以在一个可以滚动的控件中镶嵌另一个可以滚动的控件,那么我们可以通过自定义GridView设置为不滚动. MyGridView import android