`
dengrui0917
  • 浏览: 12667 次
  • 性别: Icon_minigender_2
  • 来自: 南京
社区版块
存档分类
最新评论

ExpandableListView

阅读更多

一个比较实用的EapandableListView,样式如附件:

1。在xml添加EapandalbeListView,然后添加一个每项的内容  search_result_item.xml

 

...  
<ExpandableListView android:id="@+id/searchResultsort"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    style="@style/view"
    android:background="#FFFFFF" />...

 2.代码片段

 

 

public class Main extends LinearLayout implements ImageRecyle
{
	/**
	 * 封装分类的搜索结果类的实例
	 */
	private ExpandableListView listView;
	private SearchExpandableAdapter seadapter;
	/**
	 * 上下文对象  
	 */
	private Context mContext;
	/**
	 * 选项被选中是的背景色
	 */
	public static final int SELECTED_ITEM_COLOR = 0xFFaaddFF;
	
	/**
	 * 构造函数
	 * 
	 * @param context  上下文对象  
	 */
	public SearchResultSort(final Context context)
	{
		super(context);
		
		mContext = context;
		
		// 获取页面布局
		View mainView = LayoutInflater.from(context).inflate(
				R.main, this);
		// 获取封装好的搜索结果列表
		listView = (ExpandableListView) findViewById(R.id.searchResultsort);
		seadapter=new SearchExpandableAdapter(mContext);
		listView.setAdapter(seadapter);
		// 获取搜索列表的分组数量
		int groupCount = listView.getCount();
		if (groupCount > 0)
		{
			// 展开第一个组
			listView.expandGroup(0);
		}
		// 设置子元素被点击的事件监听
		listView.setOnChildClickListener(new OnChildClickListener()
		{
			
			public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,
		            int childPosition, long id)
			{
			//对选中项进行操作				// 将所有的列表项中的颜色清空
				int visStart = listView.getFirstVisiblePosition();
				int visEnd = listView.getLastVisiblePosition();
				View viewTemp;
				for (int i = 0; i <= visEnd - visStart; i++)
				{
					viewTemp = listView.getChildAt(i);
					if (viewTemp != null && viewTemp.getTag() != null)
					{
						viewTemp.setBackgroundColor((Integer) viewTemp.getTag());
					}
				}
				
				// 设置点击的子元素
				listView.setSelectedChild(groupPosition, childPosition, true);
				
				// 设置被点击子元素的背景颜色
				v.setBackgroundColor(SELECTED_ITEM_COLOR);
				return true;
			}
		});
	}
	/**
	 * 分类列表适配器
	 */
	private class SearchExpandableAdapter extends BaseExpandableListAdapter
	{
		// 上下文对象
		private Context mContext;

		// 分类的组集合
		private String[] groups =
		{ "Music(3", "Video(5" };

		/**
		 * 构造函数
		 * 
		 * @param context  上下文对象 
		 */
		public SearchExpandableAdapter(Context context)
		{
			super();
			mContext = context;
		}

		/**
		 * 获取子元素对象
		 * 
		 * @param groupPosition 子元素所在的组集合位置
		 * @param childPosition 子元素所在元素集合的位置
		 * @return  子元素对象  
		 */
		public Object getChild(int groupPosition, int childPosition)
		{
			return null;
		}

		/**
		 * 获取子元素所在元素集合的位置
		 * 
		 * @param groupPosition 子元素所在的组集合位置
		 * @param childPosition 子元素所在元素集合的位置
		 * @return  子元素所在元素集合的位置 
		 */
		public long getChildId(int groupPosition, int childPosition)
		{
			return childPosition;
		}

		/**
		 * 获取给定组的子元素的个数
		 * 
		 * @param groupPosition 组的位置
		 * @return  该组子元素的个数 
		 */
		public int getChildrenCount(int groupPosition)
		{
			return picIds[groupPosition].length;
		}

		/**
		 * 获取组的视图
		 * 
		 * @return  组的视图  
		 */
		public TextView getGroupView()
		{
			AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
					ViewGroup.LayoutParams.FILL_PARENT, 38);
			TextView textView = new TextView(mContext);
			textView.setBackgroundResource(R.drawable.search_bg_list_small);
			textView.setTextSize(14f);
			textView.setLayoutParams(lp);
			textView.setTextColor(0xBB000000);
			textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
			textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
			textView.setPadding(35, 0, 0, 0);
			return textView;
		}

		/**
		 * 获取分组的视图
		 * 
		 * @param groupPosition 分组的位置
		 * @param isExpanded 是否已经展开
		 * @param convertView 转换视图
		 * @param parent 父元素视图
		 * @return   分组的视图
		 */
		public View getGroupView(int groupPosition, boolean isExpanded,
				View convertView, ViewGroup parent)
		{
			TextView textView = getGroupView();
			textView.setText(getGroup(groupPosition).toString());
			return textView;
		}

		/**
		 * 获取子元素的视图
		 * 
		 * @param groupPosition 子元素所在的组集合位置
		 * @param childPosition 子元素所在元素集合的位置
		 * @param isLastChild 是否是最后一个子元素
		 * @param convertView 转换视图
		 * @param parent 父元素视图
		 * @return 子元素的视图   
		 */
		public View getChildView(int groupPosition, int childPosition,
				boolean isLastChild, View convertView, ViewGroup parent)
		{
			ImageView listImage;
			TextView searchTitle;
			TextView searchSinger;
			TextView searchPay;
			
			final RatingBar searchStars;

			if (convertView == null)
			{//获得view
				convertView = LayoutInflater.from(mContext).inflate(
						R.layout.search_result_item, parent, false);
			}
			listImage = (ImageView) convertView.findViewById(R.id.searchImage);
			searchTitle = (TextView) convertView.findViewById(R.id.searchTitle);
			searchStars = (RatingBar) convertView
					.findViewById(R.id.searchStars);
			searchPay = (TextView) convertView.findViewById(R.id.searchPay);

			if (listImage != null)
			{
			   Bitmap temp = BitmapFactory.decodeResource(mContext
							.getResources(), picIds[groupPosition][childPosition]);
					listImage.setImageBitmap(temp);
			}		

			if (searchTitle != null)
			{
				String ellipsisStr = (String) TextUtils.ellipsize(
						titles[groupPosition][childPosition],
						(TextPaint) searchTitle.getPaint(), 150,
						TextUtils.TruncateAt.END);
				searchTitle.setText(ellipsisStr);
				ellipsisStr = (String) TextUtils.ellipsize(
						singers[groupPosition][childPosition],
						(TextPaint) searchTitle.getPaint(), 150,
						TextUtils.TruncateAt.END);
				searchSinger.setText(ellipsisStr);
			}

			if (searchStars != null)
			{
				searchStars.setNumStars(5);
				searchStars.setRating(stars[groupPosition][childPosition]);
			}
			
			if (childPosition % 2 == 1)
			{
				convertView.setBackgroundColor(0xfff6f6f6);
				convertView.setTag(0xfff6f6f6);
			}
			else
			{
				convertView.setBackgroundColor(0xFFFFFFFF);
				convertView.setTag(0xFFFFFFFF);
			}

			return convertView;
		}

		/**
		 * 获取组对象
		 * 
		 * @param groupPosition 所在组的位置
		 * @return  组对象  
		 */
		public Object getGroup(int groupPosition)
		{
			return groups[groupPosition];
		}

		/**
		 * 获取分组的个数
		 * 
		 * @return  分组的个数  
		 */
		public int getGroupCount()
		{
			return groups.length;
		}

		/**
		 * 获取分组的位置
		 * 
		 * @param groupPosition 分组的位置
		 * @return  分组的位置  
		 */
		public long getGroupId(int groupPosition)
		{
			return groupPosition;
		}

		/**
		 * 子元素是否可选
		 * 
		 * @param groupPosition 子元素所在的组集合位置
		 * @param childPosition 子元素所在元素集合的位置
		 * @return ture 
		 */
		public boolean isChildSelectable(int groupPosition, int childPosition)
		{
			return true;
		}

		public boolean hasStableIds()
		{
			return true;
		}
	}

	// 组包含的子元素集合
	private String[][] titles =
	{
			{ "Scarborough Fair", "Gloomy Sunday", "Fleurs Du Mai" },
			{ "Time ", "You", } };

	private int[][] picIds =
	{
			{ R.drawable.pic_list_01, R.drawable.pic_list_02,
					R.drawable.pic_list_03 },
			{ R.drawable.pic_list_04, R.drawable.music_list_06,
					R.drawable.music_list_13 }};

	private float[][] stars =
	{
	{ 4, 5, 4 },
	{ 4, 4 } };

 

  • 大小: 20.2 KB
分享到:
评论
6 楼 zwj2009 2012-06-26  
点击组菜单,原来选中的子菜单高亮不能保存住!楼主有解决的办法吗
5 楼 chenxiaba 2011-12-09  
没图没真相啊。顶个
4 楼 ahuango 2011-07-28  
转帖要留名
3 楼 l16426434 2011-03-11  
楼主 传个demo看看
2 楼 pin5icobra 2011-02-18  
能否将search_result_item.xml文件的代码帖出来啊,参考参考
1 楼 iammuyue 2010-12-21  

相关推荐

    自定义ExpandableListView结合Sqlite

    在Android开发中,`ExpandableListView`是一种可扩展的列表视图,允许用户折叠和展开子项,这对于显示层次结构的数据非常有用。本教程将深入探讨如何自定义`ExpandableListView`并结合SQLite数据库来实现数据的动态...

    ExpandableListView 点击和长按事件

    在Android开发中,`ExpandableListView` 是一个非常实用的控件,用于展示可以展开和折叠的列表。这个控件允许用户对数据进行分组,增强了用户体验,特别是处理层次结构数据时。本篇文章将深入探讨如何处理`...

    expandablelistview自定义实现单选效果

    在Android开发中,ExpandableListView是一个非常有用的控件,它允许我们展示可折叠的列表,通常用于层次结构的数据展示。本教程将详细讲解如何自定义ExpandableListView,使其一级标题具有类似于RadioButton的单选...

    ExpandableListView实现购物车页面

    在Android应用开发中,"ExpandableListView实现购物车页面"是一个常见的需求,它涉及到用户界面设计、数据管理和交互。ExpandableListView是Android SDK提供的一种可扩展的列表视图,允许用户展示分组数据,每组内...

    Android开发 ExpandableListView嵌套GridView的实现

    在Android开发中,有时我们需要展示层次结构复杂的数据,这时`ExpandableListView`就显得非常有用。它可以以折叠/展开的方式显示列表,而嵌套`GridView`则可以让我们在一个子组内展示多列数据。本文将深入探讨如何在...

    ExpandableListView展开折叠动画效果

    在Android开发中,`ExpandableListView`是一种常用的控件,用于展示可以展开和折叠的列表。这个控件允许用户在一级列表项下显示更详细的数据,通常用于构建层级结构清晰的列表,例如菜单、目录或者分类信息。在给定...

    ExpandableListView实现二级列表购物车

    "ExpandableListView实现二级列表购物车" ExpandableListView是Android中的一种视图组件,用于显示二级列表的数据。它可以将数据分组显示,方便用户浏览和操作。下面我们来详细介绍如何使用ExpandableListView实现...

    ExpandableListView 长按事件demo

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展示可折叠的列表,其中每个父项可以展开显示多个子项。这个控件非常适合于需要层次结构数据展示的应用,例如目录树、菜单或者分类信息。在这个...

    ExpandableListView仿QQ列表的实现

    在Android开发中,`ExpandableListView`是一种常用的控件,它可以展示可折叠的子列表,类似于QQ应用中的联系人列表。这个"ExpandableListView仿QQ列表的实现" demo旨在教你如何利用`ExpandableListView`创建类似QQ...

    ExpandableListView 解决子级背景色混乱 和父级展开项唯一效果实现

    在Android开发中,ExpandableListView是一个非常常用的控件,它允许我们展示层次结构的数据,比如一个树状结构。然而,在实际使用过程中,开发者经常会遇到一些问题,如子级条目的背景色混乱以及如何实现父级展开项...

    ExpandableListView的使用实例

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开和折叠分组,每个分组下可以包含多个子项。这种控件在显示层次结构数据时非常实用,比如目录结构、菜单列表或者分类信息展示。下面将详细...

    android ExpandableListView三级菜单的使用

    在Android开发中,`ExpandableListView`是一种常用的控件,它可以展示可展开和折叠的列表,通常用于构建具有层级结构的数据展示。在这个“android ExpandableListView三级菜单的使用”示例中,我们将深入探讨如何...

    一个ExpandableListView的例子,实现多级菜单分类展示

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许我们展示具有层次结构的数据,比如一个多级菜单分类的场景。在这个例子中,我们将会深入探讨如何利用`ExpandableListView`来创建一个可展开和折叠的...

    自定义ExpandableListView 、Json解析、短信等

    主要四部分内容:自定义ExpandableListView ,Json解析,短信,DatePickerDialog Json解析格式: { "help_count": "16", "date": "2012-06-15", "items": [ { "title":"PP(通讯达人)是什么?", "content":"PP...

    ExpandableListView子item选中颜色发生改变

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开和折叠分组,每个分组下可以有多个子项。当涉及到用户体验优化时,改变`ExpandableListView`子item选中状态的颜色是一种常见做法,可以提高...

    android ExpandableListView 箭头在右边 带折叠功能

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开和折叠分组,以显示或隐藏子项,这种布局方式非常适合展现层级结构的数据。在这个特定的示例中,标题提到“箭头在右边”,这通常是指在每个...

    ExpandableListView实现下拉功能

    在Android开发中,`ExpandableListView`是一种常用的控件,用于展示可以展开和折叠的列表,通常用于构建层级结构的数据展示。在这个特定的实现中,我们关注的是如何去除下拉标志,并实现点击新组时自动关闭其他已...

    自定义带CheckBox的ExpandableListView

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开和折叠不同的组,每个组下还可以包含多个子项。这个控件在显示层次结构数据时非常有用,例如菜单、设置列表等。而将`CheckBox`与`...

Global site tag (gtag.js) - Google Analytics