`
leiwuluan
  • 浏览: 707104 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

android ExpandableListView可扩展列表

 
阅读更多

先看一效果图、

列表中要有 图片和文字:


 

 

 

 

所以我们要实现一个自定义的   适配器。

 

介绍一个类:BaseExpandableListAdapter   

一看就知道是 适配器的一个基类了。

 

 

所以我们自定义的适配器要 继承它。

 

除了 完成这个 适配器,还要有两个自定义模板,分别   组和子列表的,单元模板。如下图:


 

 

 

模板布局xml  要放在 layouts  下面。

 

main_tree_group.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="45dp"
    android:background="@color/white"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/main_tree_title_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dip"
        android:background="@color/white"
        android:text="NoData"
        android:textColor="@color/black"
        android:textSize="20dp"
        android:textStyle="bold" />

</LinearLayout>

 

 

子列表模板文件

main_tree_child.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="wrap_content"
    android:background="@color/white"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:paddingBottom="5dp"
    android:paddingLeft="8dp"
    android:paddingTop="8dp" >

    <ImageView
        android:id="@+id/mainChildIcoId"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/person_icon" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/mainChildText1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="5dp"
            android:background="@color/white"
            android:gravity="center_vertical"
            android:text="CNoData"
            android:textColor="@color/black"
            android:textSize="16dp" />

        <TextView
            android:id="@+id/mainChildText2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:background="@color/white"
            android:gravity="center_vertical"
            android:text="13693668970"
            android:textColor="@color/black"
            android:textSize="12dp" />
    </LinearLayout>

</LinearLayout>

 

 

 

 

然后写两个对  模板文件的    bean

 

main_tree_group.xml 对应 bean

	//父单元
	class ExpandableGroupHolder {
		TextView title;
	} 
 

main_tree_child.xml

 

	//单元类
	class ExpandableListHolder {
		TextView nickName;
		TextView phone;
		ImageView ioc;
	} 
 

 

现在来实现最重要的关结。  适配器  

MainListExpandableListAdapter.java

 

我这里把 上面两个模板对应java bean 写成 自定义适配器的内部类。

 

 

 

 

 

 

 

package com.main.apadter;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.main.R;

public class MainListExpandableListAdapter extends BaseExpandableListAdapter {
	
	//单元类
	class ExpandableListHolder {
		TextView nickName;
		TextView phone;
		ImageView ioc;
	} 
	
	//父单元
	class ExpandableGroupHolder {
		TextView title;
	} 
	
	private List<Map<String, Object>> groupData;//组显示
	private List<List<Map<String, Object>>> childData;//子列表
	
	private LayoutInflater mGroupInflater; //用于加载group的布局xml
	private LayoutInflater mChildInflater; //用于加载listitem的布局xml
	
	//自宝义构造
	public MainListExpandableListAdapter(Context context, List<Map<String, Object>> groupData, List<List<Map<String, Object>>> childData) {
		this.childData=childData;
		this.groupData=groupData;
		
		mChildInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		mGroupInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
	
	//必须实现 得到子数据
	@Override
	public Object getChild(int groupPosition, int j) {
		return childData.get(groupPosition).get(j);
	}

	@Override
	public long getChildId(int groupPosition, int j) {
		return groupPosition;
	}

	@Override
	public int getChildrenCount(int i) {
		return childData.get(i).size();
	}

	@Override
	public Object getGroup(int i) {
		return groupData.get(i);
	}

	@Override
	public int getGroupCount() {
		return groupData.size();
	}

	@Override
	public long getGroupId(int i) {
		return i;
	}

	@Override
	public boolean hasStableIds() {//行是否具有唯一id
		return false;
	}

	@Override
	public boolean isChildSelectable(int i, int j) {//行是否可选
		return false;
	}
	
	@Override
	public View getGroupView(int groupPosition, boolean flag, View convertView, ViewGroup viewgroup) {
		ExpandableGroupHolder holder = null; //清空临时变量holder
		if (convertView == null) { //判断view(即view是否已构建好)是否为空

			convertView = mGroupInflater.inflate(R.layout.main_tree_group, null);
			holder = new ExpandableGroupHolder();
			holder.title=(TextView) convertView.findViewById(R.id.main_tree_title_id);
			convertView.setTag(holder);
		} else { //若view不为空,直接从view的tag属性中获得各子视图的引用
			holder = (ExpandableGroupHolder) convertView.getTag();
		}
		String title=(String)this.groupData.get(groupPosition).get("title");
		holder.title.setText(title);
		notifyDataSetChanged();
		return convertView;
	}
	
	@Override
	public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
			ViewGroup viewgroup) {
		ExpandableListHolder holder = null;
		if (convertView == null) {
			convertView = mChildInflater.inflate(R.layout.main_tree_child, null);

			holder = new ExpandableListHolder();
			holder.nickName = (TextView) convertView.findViewById(R.id.mainChildText1);
			holder.ioc = (ImageView) convertView.findViewById(R.id.mainChildIcoId);
			holder.phone = (TextView) convertView.findViewById(R.id.mainChildText2);
			convertView.setTag(holder);
		} else {//若行已初始化,直接从tag属性获得子视图的引用
			holder = (ExpandableListHolder) convertView.getTag();
		} 
		Map<String,Object> unitData=this.childData.get(groupPosition).get(childPosition);
		holder.nickName.setText((String)unitData.get("nickName"));
		holder.ioc.setImageResource((Integer) unitData.get("ico"));
		holder.phone.setText((String)unitData.get("phone"));
		return convertView;
	}
}
 

 

 

 

接下来要做的就是  利用自定义的适配器。  添加盟数据进行显了。

 

1、建一个 xml  设样式并设id   

<?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:listSelector="@color/white"
    android:orientation="vertical" >

<ExpandableListView
            android:id="@+id/expandable_id"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@color/white"
            android:drawSelectorOnTop="false"
            android:listSelector="@color/white" />

</LinearLayout>
 

 

 

创建activity

public class MainActivity extends Activity {
	// 声明对象
	private MainListExpandableListAdapter adapter = null;
	List<Map<String, Object>> groups;
	List<List<Map<String, Object>>> childs;
	ExpandableListView expandableListView;

	private FriendsDao friendsDao;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		friendsDao=new FriendsDao(this,"ll1x.db",null,2);
		
		//为ExpandableListView准备数据
		groups = new ArrayList<Map<String, Object>>();
		Map<String, Object> group = new HashMap<String, Object>();
		group.put("title", "我的家人");
		groups.add(group);

		List<Map<String, Object>> child1 = new ArrayList<Map<String, Object>>();
		Cursor cursor = friendsDao.selectAll();
		while(cursor.moveToNext()){
			Map<String, Object> child1Data1 = new HashMap<String, Object>();
			child1Data1.put("nickName", cursor.getString(cursor.getColumnIndex("nickName")));
			child1Data1.put("phone", cursor.getString(cursor.getColumnIndex("phone")));
			child1Data1.put("ico", R.drawable.icon);
			child1.add(child1Data1);
		}

		childs = new ArrayList<List<Map<String, Object>>>();
		childs.add(child1);

		// 实例化ExpandableListView对象
		expandableListView = (ExpandableListView) findViewById(R.id.expandable_id);
		// 实例化ExpandableListView的适配器
		adapter = new MainListExpandableListAdapter(getApplicationContext(), groups, childs);

		// 设置适配器
		expandableListView.setAdapter(adapter);

		// 设置监听器
		expandableListView.setOnChildClickListener(new OnChildClickListener() {

			public boolean onChildClick(ExpandableListView parent, View v,
					int groupPosition, int childPosition, long id) {
				Log.d("test", "GroupPosition is " + groupPosition);
				Log.d("test", "ChildPosition is" + childPosition);
				return false;
			}
		});
	}
}
 

 

ok 可了。可以放到项目当去了。

 

 

 

 

 

 

  • 大小: 66.3 KB
  • 大小: 96.3 KB
  • 大小: 7.1 KB
  • 大小: 14.5 KB
1
1
分享到:
评论

相关推荐

    Android 利用ExpandableListView实现城市列表

    `ExpandableListView`是Android SDK提供的一种特殊的ListView,它允许每个列表项可以进一步扩展成子列表。这个控件由两层数据结构组成:父级列表(Groups)和子级列表(Children)。父级列表是可点击的,点击后会...

    android ExpandableListView三级菜单的使用

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

    Android开发丶ExpandableListView实现可展开列表

    在Android开发中,`ExpandableListView`是一种非常实用的列表控件,它允许用户通过点击条目来展开或折叠子列表。这个控件是`ListView`的扩展,提供了更丰富的交互性和展示层次结构数据的能力。在本文中,我们将深入...

    Android 扩展 带CheckBox的expandableListview

    在Android开发中,ExpandableListView是一种可扩展的列表视图,它可以包含多个子项,非常适合用来展示层次结构的数据。在本项目"Android 扩展 带CheckBox的expandableListview"中,开发者针对ExpandableListView进行...

    android ExpandableListView完整实现

    `ExpandableListView`继承自`ListView`,增加了可扩展的功能。它由两个基本组件构成:父条目(Group)和子条目(Child)。一个父条目可以包含零个或多个子条目,而多个父条目则构成了整个`ExpandableListView`的数据...

    Android的ExpandableListView+CheckBox全选

    在Android开发中,`ExpandableListView`是一种常用的控件,它允许用户展开...通过以上步骤,我们可以创建一个具有联动效果的可扩展列表,用户可以选择列表中的任意子项,也可以通过全选或反选按钮一次性选择所有子项。

    ExpandableListView 展开列表控件

    `ExpandableListView`是Android平台中一个非常实用的列表控件,它允许用户展示层次结构的数据,例如,一个父项可以展开显示多个子项。在Android应用开发中,当需要展示具有嵌套关系的数据时,`ExpandableListView`是...

    android ExpandableListView demo

    在Android开发中,`ExpandableListView`是一种非常实用的视图组件,它扩展了标准的`ListView`功能,允许开发者创建具有可展开和折叠的分组列表。这种控件非常适合于展示层次结构清晰、信息组织有序的数据,比如目录...

    Android ExpandableListView双层嵌套实现三级树形菜单

    在这个"Android ExpandableListView双层嵌套实现三级树形菜单"的例子中,我们将深入探讨如何通过扩展这个控件来创建一个包含三层结构的树形菜单。 首先,我们要理解ExpandableListView的基本工作原理。...

    【Android】自定义可扩展列表ExpandableListView

    本篇文章将深入探讨如何在Android中自定义可扩展列表`ExpandableListView`。 首先,我们要理解`ExpandableListView`的基本结构。它由两部分组成:父项(Group)和子项(Child)。每个父项可以包含多个子项,用户...

    Android之ExpandableListView控件

    在Android开发中,`ExpandableListView`是一种常用的控件,它扩展了标准的`ListView`功能,允许子项可以被展开或折叠,呈现层次结构的数据。这个控件非常适合用来展示具有树状结构的信息,比如菜单、目录或者组织...

    完美ExpandableListView仿QQ列表,可扩展性强

    这个“完美ExpandableListView仿QQ列表”项目旨在提供一种高度可扩展和用户友好的实现,使得开发者能够轻松地创建具有类似QQ列表功能的应用。 首先,我们来详细了解一下ExpandableListView的基本概念。它是一个特殊...

    ExpandableListView可扩展Listveiw

    这个小Demo是关于如何使用`ExpandableListView`来创建一个可扩展的列表视图,使应用界面更加互动和功能丰富。 `ExpandableListView`与普通的`ListView`相比,具有更高级的功能。它不仅仅是一个简单的列表,而是可以...

    Android中ExpandableListView示例

    接下来,我们需要创建一个扩展`BaseExpandableListAdapter`的自定义适配器,用于填充`ExpandableListView`。适配器负责将数据模型转换为视图。在这个过程中,我们需要重写以下几个方法: - `getGroupCount()`:返回...

    Android ExpandableListView+PopupWindow+json

    `ExpandableListView`是一个可扩展的列表视图,允许用户展开和折叠各个组,每个组内可以包含多个子项。在Android中,`ExpandableListView`的使用需要自定义适配器,通常采用`BaseExpandableListAdapter`作为基础。...

    Android之ExpandableListView控件的使用

    `ExpandableListView`是`ListView`的一个扩展,增加了可折叠和可展开的功能。与`ListView`相比,`ExpandableListView`包含两种类型的条目:父条目(Group)和子条目(Child)。每个父条目可以有零个或多个子条目,...

    ExpandableListView实现购物车页面

    ExpandableListView是Android SDK提供的一种可扩展的列表视图,允许用户展示分组数据,每组内可以包含多个子项,非常适合用于构建层次结构清晰的购物车界面。 首先,我们要理解ExpandableListView的基本工作原理。...

    Android自定义ExpandableListView实现二级列表

    在Android开发中,`ExpandableListView`是一种常用的控件,它可以展示可展开和折叠的列表,通常用于构建具有层级结构的数据展示。这个控件能够帮助用户更好地理解和操作复杂的数据,例如菜单、目录或者树状结构的...

    Android代码-基于自定义适配器的ExpandableListView源码.zip

    在Android开发中,`ExpandableListView`是一种可扩展的列表视图,允许用户折叠和展开组项以显示或隐藏子项。这个`Android代码-基于自定义适配器的ExpandableListView源码.zip`文件包含了一个示例项目,演示了如何...

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

    在这个例子中,我们将会深入探讨如何利用`ExpandableListView`来创建一个可展开和折叠的菜单系统,实现丰富的交互效果。 `ExpandableListView`与普通的`ListView`相比,其主要优势在于它支持子项的展开和收缩,这...

Global site tag (gtag.js) - Google Analytics