`
肖默it
  • 浏览: 24542 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

嵌套GridView的ExpandableListView

 
阅读更多
这些天想做一个嵌套GridView的ExpandableListView,就是说,点击ExpandableListView展开显示GridView,基本实现思路就是重写ExpandableListView的getChildView()函数,代码如下:
package com.ns.gridlist;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources.Theme;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ExpandableListView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.SimpleCursorAdapter;
import android.widget.SimpleCursorTreeAdapter;
import android.widget.TextView;

/**
 * @author xiaolifan 2011-12-22
 * 嵌套显示GridView的ExpandableListView*/

public class GridListViewActivity extends Activity {
	private ExpandableListView mExpandableListView;
	/**
	 * 获取联系人ID的列位置,一般都是第一个,也就是0
	 */
	private int mGroupIdColumnIndex;

	/**
	 * 要查询联系人的电话号码的字段(也就是子视图的信息)
	 */
	private String mPhoneNumberProjection[] = new String[] {
			ContactsContract.CommonDataKinds.Phone._ID,
			ContactsContract.CommonDataKinds.Phone.NUMBER, };

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		mExpandableListView = (ExpandableListView) findViewById(R.id.expandableListView1);
		// 查询联系人并获取其Cursor对象
		Cursor groupCursor = managedQuery(
				ContactsContract.Contacts.CONTENT_URI, new String[] {
						ContactsContract.Contacts._ID,
						ContactsContract.Contacts.DISPLAY_NAME }, null, null,
				null);

		// 保存取联系人ID的列位置
		mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID);
		// 设置 adapter
		MyExpandableListAdapter mAdapter = new MyExpandableListAdapter(
				groupCursor, this,
				R.layout.list_header_layout,// 组视图(联系人)
				R.layout.list_grid_layout,// 子视图(电话号码)
				new String[] { ContactsContract.Contacts.DISPLAY_NAME }, // 显示联系人名字
				new int[] { R.id.textView1 },
				new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER }, // 显示电话号码
				new int[] { R.id.textView2 });
		mExpandableListView.setAdapter(mAdapter);
		
		mExpandableListView.setOnItemClickListener(new OnItemClickListener() {

			public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
				// TODO Auto-generated method stub
				
			}
		});

	}

	/**
	 * 
	 * 为ExpandableListView填充数据的Adapter类,在这里面我们实现了在ExpandableListView中嵌套显示Gridview的功能;
	 * 
	 */
	private class MyExpandableListAdapter extends SimpleCursorTreeAdapter implements OnItemClickListener{

		private int gridLayoutResId;
		private LayoutInflater mLayoutInflater;
		private Cursor mGroupCursor;//用于填充数据的Cursor对象

		public MyExpandableListAdapter(Cursor cursor, Context context,
				int groupLayout, int childLayout, String[] groupFrom,
				int[] groupTo, String[] childrenFrom, int[] childrenTo) {
			// 别忘了调用父类的同等参数的构造函数
			// 这里用了八个参数,lastChildLayout没有设置;还有就是groupLayout整合了collapsedGroupLayout和expandedGroupLayout
			super(context, cursor, groupLayout, groupFrom, groupTo,
					childLayout, childrenFrom, childrenTo);
			this.gridLayoutResId = childLayout;
			mLayoutInflater = LayoutInflater.from(GridListViewActivity.this);
			this.mGroupCursor = cursor;
		}

		@Override
		public int getChildrenCount(int groupPosition) {
			//这里返回1是为了让ExpandableListView只显示一个ChildView,否则在展开
			//ExpandableListView时会显示和ChildCount数量相同的GridView
			return 1;
		}

		/**
		 * 
		 * 回调函数,主要实现当选中某个组视图时,要查询指定的子视图所需的信息。<br>
		 * 注意:<br>
		 * 别忘了在AdroidManifest.xml中配置读取联系人的权限。<br>
		 * 
		 */
		@Override
		protected Cursor getChildrenCursor(Cursor groupCursor) {
			// 获取联系人ID
			Long contactId = groupCursor.getLong(mGroupIdColumnIndex);
			Log.i("debug_out", "the contact id is " + contactId);
			// 构造电话号码URI
			Uri.Builder builder = ContactsContract.CommonDataKinds.Phone.CONTENT_URI.buildUpon();
			Uri phoneNumbersUri = builder.build();
			// 开始查询,Android推荐我们是其自身的managedQuery()方法进行查询,也就是自动管理Cursor。
			return managedQuery(
					phoneNumbersUri,
					mPhoneNumberProjection,
					ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? ",
					new String[] { String.valueOf(contactId) }, null);
		}

		/**
		 * 实现嵌套GridView的关键所在,这里返回一个包含GridView控件的View并未这个GridView绑定数据*/
		@Override
		public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {
			ViewHolder mViewHolder;
			if (convertView == null) {//利用视图缓存优化数据加载过程
				convertView = mLayoutInflater.inflate(this.gridLayoutResId,null);
				mViewHolder = new ViewHolder();
				mViewHolder.gridView = (GridView) convertView.findViewById(R.id.gridView1);
				convertView.setTag(mViewHolder);
			} else {
				mViewHolder = (ViewHolder) convertView.getTag();
			}
			this.mGroupCursor.moveToPosition(groupPosition);

			Cursor childCursor = getChildrenCursor(this.mGroupCursor);
			//给GridView填充数据
			GridAdapter gridAdapter = new GridAdapter(
					GridListViewActivity.this,
					R.layout.grid_item_layout,
					childCursor,
					new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER },
					new int[] { R.id.textView2 });
			mViewHolder.gridView.setAdapter(gridAdapter);
			mViewHolder.gridView.setOnItemClickListener(this);
			return convertView;
		}

		class ViewHolder {
			GridView gridView;
		}

		public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
			Adapter adapter = parent.getAdapter();
			Cursor cursor = (Cursor) adapter.getItem(position);
			String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
			Log.i("debug_out", "------------>onItemClick the number is " + number);
		}

	}

	private class GridAdapter extends SimpleCursorAdapter {
		private LayoutInflater mLayoutInflater;
		private Cursor mCursor;

		public GridAdapter(Context context, int layout, Cursor c,String[] from, int[] to) {
			super(context, layout, c, from, to);
			mLayoutInflater = LayoutInflater.from(GridListViewActivity.this);
			this.mCursor = c;
		}

		class ViewHolder2 {
			ImageView ig;
			TextView tx;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			ViewHolder2 mViewHolder2;
			if (convertView == null) {
				convertView = mLayoutInflater.inflate(R.layout.grid_item_layout, null);
				mViewHolder2 = new ViewHolder2();
				mViewHolder2.ig = (ImageView) convertView.findViewById(R.id.imageView2);
				mViewHolder2.tx = (TextView) convertView.findViewById(R.id.textView2);
				convertView.setTag(mViewHolder2);
			} else {
				mViewHolder2 = (ViewHolder2) convertView.getTag();
			}
			
			this.mCursor.moveToPosition(position);
			String number = this.mCursor.getString(mCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
			Log.i("debug_out", "the number is " + number);
			mViewHolder2.tx.setText(number);
			return convertView;
		}

	}

}
0
0
分享到:
评论
1 楼 本草洋葱 2013-08-15  
学习学习,求份源码,楼主发一份源码来看看吧,要是能有图就好了。931918906@qq.com

相关推荐

    Android开发 ExpandableListView嵌套GridView的实现

    本文将深入探讨如何在Android中实现`ExpandableListView`嵌套`GridView`。 首先,我们要理解`ExpandableListView`的基本概念。它是一种特殊的`ListView`,具有分组(Group)和子项(Child)的概念。每个分组可以...

    ExpandableListView 中完美嵌套 GridView

    在Android开发中,有时我们需要创建复杂布局以满足用户界面的需求,比如在一个ExpandableListView中嵌套GridView。这种设计可以提供层次分明且可扩展的数据展示,让用户能够方便地浏览和操作多级数据。本文将深入...

    ExpandableListView 嵌套gridView

    而在这个特定的案例中,我们将讨论如何将 `GridView` 嵌套在 `ExpandableListView` 的各个分组中,为用户提供更复杂的布局和交互体验。 首先,我们要理解 `ExpandableListView` 的基本工作原理。`...

    安卓ExpandableListView嵌套Gridview嵌套用法,与多点触控图片缩放

    本篇文章将详细探讨如何在Android中实现ExpandableListView嵌套GridView,以及如何实现多点触控图片缩放的功能。 首先,ExpandableListView是一种可以展开和折叠的列表视图,用于展示层次结构的数据。它允许每个父...

    android中ExpandableListView嵌套GridView的使用

    下面将详细介绍如何在`Android`中实现`ExpandableListView`嵌套`GridView`。 ### 1. ExpandableListView基本概念 `ExpandableListView`是Android提供的一个特殊的列表控件,它可以显示分组数据,每个分组下可以...

    ExpandableListView嵌套GridView的混合使用

    1、ExpandableListView嵌套GridView 2、group中自定义文字和图片 原文章在 http://blog.csdn.net/u011123829/article/details/9278351

    Android开发丶ExpandableListView嵌套GridView的实现

    在`ExpandableListView`中嵌套`GridView`的实现过程主要包括以下几个步骤: 1. **创建适配器**:首先,你需要创建一个自定义的`ExpandableListAdapter`,继承自`BaseExpandableListAdapter`。这个适配器将负责填充`...

    ExpandableListView嵌套GridView,GridView中的item带有选中功能

    在这个主题中,我们将深入探讨如何在`ExpandableListView`中嵌套`GridView`,并实现`GridView`中每个item的选中功能。 首先,我们需要创建一个`ExpandableListView`。这个控件可以用来展示分组数据,每组数据可以...

    Listview 嵌套gridview

    但很多人不需要ExpandableListView 只是单纯的ListView",这表明开发者可能发现了一个常见但并非总是必要的场景,即使用可展开的ListView(ExpandableListView)来嵌套GridView。ExpandableListView允许用户展开或...

    android中ExpandableListView嵌套ListView和GridView的使用

    本文将详细讲解如何在`ExpandableListView`中嵌套`ListView`和`GridView`。 首先,理解`ExpandableListView`的基本用法。`ExpandableListView`是Android提供的一个可扩展的列表视图,它允许用户点击父项来显示或...

    可展开列表ExpandableListView嵌套GirdView demo

    然而,如果在每个组内需要展示多列数据,单纯使用ExpandableListView可能无法满足需求,这时我们可以考虑将GridView嵌套在ExpandableListView的每个子项中,以实现更加复杂和灵活的布局。下面将详细解释如何实现“可...

    ExpandableListView,recyclerview的使用

    同样,`GridView`是另一种实现网格布局的控件,但它不支持像`RecyclerView`那样高效地复用视图。 总结来说,`ExpandableListView`、`RecyclerView`和`ListView`都是Android中用于展示列表数据的重要组件,各有其...

    解决scrollView和gridView和ListView嵌套的冲突

    6. **使用ExpandableListView**:如果数据结构复杂,可以考虑使用ExpandableListView,它允许展开和折叠组项,这可以减少嵌套的需求。 7. **优化滚动性能**:在处理大量数据时,应优化滚动性能,比如使用ViewHolder...

    GridView+72般绝技,分页排序,详细介绍gridview的各种用法,并用代码演示.

    7. 分组显示:通过嵌套GridView或使用ExpandableListView,实现数据的分组展示。 8. 滑动刷新和加载更多:结合SwipeRefreshLayout,实现上拉刷新和下拉加载更多功能。 9. 横向滚动:通过设置横竖轴的滚动方向,...

    ScrollView和ListView和GridView冲突解决之自定义ListView和GridView

    1. **嵌套滚动**:当ScrollView嵌套ListView或GridView时,由于两者都有滚动功能,会导致滚动冲突,即一个组件滚动时,另一个组件也可能跟随滚动。 2. **触摸事件处理**:ScrollView会捕获所有的触摸事件,导致...

    expandlist嵌套双listview

    而在此场景下,我们需要在每个ExpandableListView的子列表项中再嵌套一个ListView,形成双层列表结构,进一步增强数据展示的层次感。 首先,理解expandlist(即ExpandableListView)的工作原理至关重要。...

    ListView_GridView2

    - 如果好友列表需要按字母分组,可以使用ExpandableListView,或者在ListView上实现类似的功能,通过自定义Adapter和头部视图。 9. **优化性能**: - 使用ListView的setHasStableIds(true)和设置唯一ID,可以帮助...

    Android ScrollView 下嵌套 ListView 或 GridView出现问题解决办法

    另外,还可以尝试使用`ExpandableListView`,它在某些场景下可以避免嵌套滚动的问题。 总的来说,处理ScrollView与ListView或GridView的嵌套问题需要深入理解Android的布局系统和测量过程。通过适当的方法调整,...

    Android笔记之:在ScrollView中嵌套ListView的方法

    此外,还有其他一些相关的Android开发知识点,例如如何解决ScrollView嵌套GridView或ExpandableListView时的冲突,如何在ScrollView中嵌套其他可滚动视图(如ViewPager)等。这些都需要开发者深入理解Android的触摸...

    可展开的ListView大集合

    "可展开的ListView大集合"是一个专题,涵盖了多种与ListView相关的扩展功能,如GridView和ExpandableListView。这些视图允许用户以网格或层级结构的形式查看数据,提高了用户界面的交互性和用户体验。 1. **...

Global site tag (gtag.js) - Google Analytics