1. ExpandableListView是一个用来显示二级节点的ListView。

比如如下效果的界面:

2. 使用ExpandableListView步骤:

(1)要给ExpandableListView设置适配器,那么必须先设置数据源;

(2)数据源,就是此处的适配器类ExpandableAdapter,此方法继承了BaseExpandableListAdapter,它是ExpandableListView的一个子类。需要重写里面的多个方法。getChildView()和getGroupView()方法设置自定义的布局;

(3)数据源设置好,直接给ExpandableListView.setAdapter()即可实现收缩功能。

3.下面就是我们就利用具体的案例来说明如何使用这个ExpandableListView组件:

(1)首先我们定义我们的布局文件activity_main.xml 如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.himi.expandablelistview.MainActivity" >
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="QQ通讯录"
android:textSize="30sp"
android:textColor="#55ff0000"
android:gravity="center_horizontal"
/> <ExpandableListView
android:id="@+id/expandablelv"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ExpandableListView> </LinearLayout>

在这个activity_main.xml布局文件中,我们引入了组件ExpandableListView,布局效果图如下:

(2)定义我们自己的适配器MyExpandablelistviewAdapter,让它继承自BaseExpandableListAdapter,然后实现继承的方法。这里我们直接把数据源放在了我们自定义的类MyExpandablelistviewAdapter之中,然后绑定这个数据源到我们定的MyExpandablelistviewAdapter之中。

数据源我们定义为:

    private String[] groups = {"家人","同学","同事"};
private String[][] childs = { {"老爸","老妈"}, {"刘德华","黎明","郭富城","张学友"}, {"马云","比尔盖茨",
"巴菲特"} };
private int[][] childs_imgs = { { R.drawable.img1, R.drawable.img2 },
{ R.drawable.img3, R.drawable.img4 , R.drawable.img5, R.drawable.img6},
{ R.drawable.img7, R.drawable.img8 , R.drawable.img9}
};

MVC模式:在Android项目中,业务逻辑,数据处理等担任了Model(模型)角色,XML界面显示等担任了View(视图)角色,Activity担任了Contronller(控制器)角色。contronller(控制器)是一个中间桥梁的作用,通过接口通信来协同 View(视图)和Model(模型)工作,起到了两者之间的通信作用。

这里的MyExpandablelistviewAdapter.java:

package com.himi.expandablelistview.adpater;

import android.view.ViewGroup.LayoutParams;
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.himi.expandablelistview.R; /**
* 自定义适配器MyExpandablelistviewAdapter
* @author Administrator
*
*/
public class MyExpandablelistviewAdapter extends BaseExpandableListAdapter {
private Context context ;
private String[] groups = {"家人","同学","同事"};
private String[][] childs = { {"老爸","老妈"}, {"刘德华","黎明","郭富城","张学友"}, {"马云","比尔盖茨",
"巴菲特"} };
private int[][] childs_imgs = { { R.drawable.img1, R.drawable.img2 },
{ R.drawable.img3, R.drawable.img4 , R.drawable.img5, R.drawable.img6},
{ R.drawable.img7, R.drawable.img8 , R.drawable.img9}
}; //引入一个字段context,方便Activity实例化MyExpandablelistviewAdapter
public MyExpandablelistviewAdapter(Context context) {
this.context = context;
} //获取一级菜单的分组数目,比如这里就是3组:"我的好友","同学","同事"
public int getGroupCount() {
return groups.length;
} //获取每个一节菜单中二级菜单的分组数目,比如"家人"中有2个条目("老爸","老妈")
public int getChildrenCount(int groupPosition) {
return childs[groupPosition].length;
}
//获取每个一级菜单子项对象
public String getGroup(int groupPosition) {
return groups[groupPosition];
}
//获取每个二级菜单子项对象
public String getChild(int groupPosition, int childPosition) {
return childs[groupPosition][childPosition];
} //获取每个一级菜单子项对象Id
public long getGroupId(int groupPosition) {
return groupPosition;
}
//获取每个二级菜单子项对象Id
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
} /**
* hasStableIds有关于MyExpandablelistviewAdapter适配器刷新顺序
* getGroupId和getChildId两个方法获取对象Id,获取到的Id,ExpandableListView会根据这个Id确定位置显示内容
* 然而Id是否有效稳定是由hasStableIds决定的,也就是说:这个方法就是判断item的id是否稳定,
* 如果有自己的id也就是true,那就是稳定,否则不稳定,则根据item位置来确定id
*
*/
public boolean hasStableIds() {
return true;
} //渲染一级菜单
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
if(convertView == null) {
/**
* LayoutInflater是一个抽象类,它的inflate方法可以把一个xml文件转化为View对象
* 对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入
* 刚刚说明了:LayoutInflater是一个抽象类,要获取LayoutInflater的实例;
* 获得 LayoutInflater 实例的三种方式:
* 1.LayoutInflater inflater = getLayoutInflater(); //调用Activity的getLayoutInflater()
*
* 2.LayoutInflater localinflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
*
* 3. LayoutInflater inflater = LayoutInflater.from(context);
* 上面三种方法的本质是一样的
*/
LayoutInflater minflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = minflater.inflate(R.layout.group_item,null);
}
TextView tv = (TextView) convertView.findViewById(R.id.textview_group);
tv.setText(groups[groupPosition]);
tv.setTextSize(25);
tv.setPadding(15, 5, 0, 0);
return convertView;
}
//渲染二级菜单
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
if(convertView == null) {
LayoutInflater minflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = minflater.inflate(R.layout.child_item,null);
}
ImageView iv = (ImageView) convertView.findViewById(R.id.imageview_child);
TextView tv = (TextView) convertView.findViewById(R.id.textview_child); iv.setImageResource(childs_imgs[groupPosition][childPosition]);
//导入的包为:import android.view.ViewGroup.LayoutParams;
LayoutParams params = iv.getLayoutParams();
params.width = 200;
params.height = 200;
iv.setLayoutParams(params); tv.setText(childs[groupPosition][childPosition]);
//记得return convertView
return convertView;
} //true:让子项可选 ; false:让子项不可选
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
} }

(3)最后在MainActivity.java中绑定我们定义的MyExpandablelistviewAdapter(此时的适配器已经绑定了数据源,适配器可以控制其相应的显示),这使用我们还需要绑定适配器到模型Model,就是说绑定适配器到ExpandableListView:

这里的MainActivity.java:

package com.himi.expandablelistview;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.Toast; import com.himi.expandablelistview.adpater.MyExpandablelistviewAdapter; public class MainActivity extends Activity {
private ExpandableListView expan_listview; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
expan_listview = (ExpandableListView) findViewById(R.id.expandablelv);
expan_listview.setAdapter(new MyExpandablelistviewAdapter(this));
expan_listview.setOnChildClickListener(new OnChildClickListener() { public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) { Toast.makeText(MainActivity.this, "你点击的是第"+(groupPosition+1)+"的菜单下的第"+(childPosition+1)+"选项", 0).show();
return false;
}
});
} }

这里我们添加了一个ExpandableListView的点击事件:expan_listview. setOnChildClickListener;当然这里还有其他很多监听事件,这里我们不多加详解,我们只要知道灵魂就行了。

(4)运行结果图如下:

Android 高级UI设计笔记01:使用ExpandableListView组件(ListView的扩展)的更多相关文章

  1. Android 高级UI设计笔记07:RecyclerView 的详解

    1. 使用RecyclerView       在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...

  2. Android 高级UI设计笔记08:Android开发者常用的7款Android UI组件(转载)

    Android开发是目前最热门的移动开发技术之一,随着开发者的不断努力和Android社区的进步,Android开发技术已经日趋成熟,当然,在Android开源社区中也涌现了很多不错的开源UI项目,它 ...

  3. Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item

    1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item: (1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有 ...

  4. Android 高级UI设计笔记06:仿微信图片选择器(转载)

    仿微信图片选择器: 一.项目整体分析: 1. Android加载图片的3个目标: (1)尽可能的去避免内存溢出. a. 根据图片的显示大小去压缩图片 b. 使用缓存对我们图片进行管理(LruCache ...

  5. Android 高级UI设计笔记21:Android SegmentView(分段选择控件)

    1. 分段控制(SegmentView) 首先我们先看看什么是SegmentView的效果,如下: 分段控制这个View控件是ios7的分段控制,和QQ消息页面顶部的效果一样,android没有这个控 ...

  6. Android 高级UI设计笔记19:PopupWindow使用详解

    1. PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的. 2. PopupWindow使用 ...

  7. Android 高级UI设计笔记17:Android在非UI线程中显示Toast

    1. 子线程的Toast怎么显示不出来? 因为Toast在创建的时候会依赖于一个Handler,并且一个Handler是需要有一个Looper才能够创建,而普通的线程是不会自动去创建一个Looper对 ...

  8. Android 高级UI设计笔记14:Gallery(画廊控件)之 3D图片浏览

    1. 利用Gallery组件实现 3D图片浏览器的功能,如下: 2. 下面是详细的实现过程如下: (1)这里我是测试性代码,我的图片是自己添加到res/drawable/目录下的,如下: 但是开发中不 ...

  9. Android 高级UI设计笔记09:Android如何实现无限滚动列表

    ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验 ...

随机推荐

  1. ECmall错误:Call to a member function get_users_count() on a non-object

    问题描述: 在后台添加了一个app报错:Call to a member function get_users_count()Fatal error: Call to a member functio ...

  2. 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 ->最大二分匹配)

    [题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何一 ...

  3. Android4.0以下View的Drag和Drop简单实现

    主要代码部分: 实现View的onTouch方法,变换落点的X,Y坐标,定义两个变量存放拖动前的坐标位置. int prevX,prevY; @Override public boolean onTo ...

  4. dll的加载方式主要分为两大类,显式和隐式链接

    之前简单写过如何创建lib和dll文件及简单的使用(http://blog.csdn.net/betabin/article/details/7239200).现在先再深入点写写dll的加载方式. d ...

  5. bzoj1034

    贪心 尽可能让最强的赢,最弱的赢,都不行则最弱打最强 感性的想,我肯定要尽可能的赢,而且赢的要对等 实在不能赢就拿最小的拼,所谓的田忌赛马策略 由于总分一定,己方最差即己方最好时对方的分数 ..] o ...

  6. Phpwind v9.0 存储型xss跨站漏洞

    漏洞版本: Phpwind v9.0 漏洞描述: Phpwind专注于中小网站应用的整合和价值的发掘,我们认为,以社区为网站的基础,可以提供丰富的应用,满足人们获取信息.交流.娱乐.消费等生活需求.获 ...

  7. SharePoint2010沙盒解决方案基础开发——关于TreeView树形控件读取列表数据(树形导航)的webpart开发及问题

    转:http://blog.csdn.net/miragesky2049/article/details/7204882 SharePoint2010沙盒解决方案基础开发--关于TreeView树形控 ...

  8. Http状态码完整说明

    在网站建设的实际应用中,容易出现很多小小的失误,就像mysql当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样, 一些常见的状态码为: 200 - 服务器成功返 ...

  9. centos 6.4 大容量磁盘分区步骤

    首先安装分区工具 yum install parted 假设需要分区的设备为/dev/sdb 运行如下命令 parted /dev/sdb (parted) mklabel gpt #大于2TB的磁盘 ...

  10. 今天遇到的i++问题之记录

    今天逛贴吧看到的,与自己预想的不同,于是在群里求解后方得知答案,遂记录之.代码来袭. function a(){ var i=1; i++; alert(i); } var c = a(); c(); ...