Android:ExpandableListView使用
前言
- 每一个child item有一个TextView和一个ImageView删除标识。
- 当点击一个child item,弹出Toast提示。
- child item能够通过点击删除图标来删除。
- 每次展开特定group时。其它group自己主动收缩。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd3p5XzE5ODg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
Android实现
XML布局文件
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ExpandableListView
android:id="@+id/expandable_list_view_id"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ExpandableListView> </RelativeLayout>
group_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#ffffff"
android:orientation="horizontal"
android:gravity="center_vertical"> <TextView
android:id="@+id/group_text"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:textColor="#808080"
android:textSize="16sp"
android:gravity="center_vertical"
android:layout_alignParentLeft="true"
android:text="@string/app_name"/> <ImageView
android:id="@+id/group_indicator"
android:src="@drawable/ic_guide_listview_down"
android:contentDescription="@null"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginRight="16sp"
android:layout_alignParentRight="true"/> </RelativeLayout>
child_item.xml
<? xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/child_item_id"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="10dp" > <TextView
android:id="@+id/child_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:paddingLeft="25dp" /> <ImageView
android:id="@+id/child_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:contentDescription="@null"
android:src="@drawable/delete" /> </RelativeLayout>
自己定义Adapter
- 使用静态内部类标识父item和子item的weidget,由于这些控件的id是同样的,这样能够节省掉每次findViewById的时间。
- 重写(override)isChildSelectable方法,返回true,表示子item是能够点击的。
package com.example.expandtutorial; import java.util.ArrayList; import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView; public class CustomerAdapter extends BaseExpandableListAdapter{
private ArrayList<ParentObj> datas;
private Context context; public CustomerAdapter(ArrayList<ParentObj> datas, Context context) {
super();
this.datas = datas;
this.context = context;
} @Override
public int getGroupCount() {
return datas.size();
} @Override
public int getChildrenCount(int groupPosition) {
return datas.get(groupPosition).getChilds().size();
} @Override
public Object getGroup(int groupPosition) {
return datas.get(groupPosition);
} @Override
public Object getChild(int groupPosition, int childPosition) {
return datas.get(groupPosition).getChilds().get(childPosition);
} @Override
public long getGroupId(int groupPosition) {
return groupPosition;
} @Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
} @Override
// 是否有稳定的id。跟刷新顺序有关
public boolean hasStableIds() {
return false;
} @Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
ParentViewHolder pviewHolder; if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.group_item, parent, false);
pviewHolder = new ParentViewHolder();
pviewHolder.pTextView = (TextView) convertView.findViewById(R.id.group_text);
pviewHolder.pImageView = (ImageView) convertView.findViewById(R.id.group_indicator);
convertView.setTag(pviewHolder);
} pviewHolder = (ParentViewHolder)convertView.getTag();
pviewHolder.pTextView.setTypeface(null, Typeface.BOLD);
pviewHolder.pTextView.setText(datas.get(groupPosition).getpName()); if (isExpanded) {
pviewHolder.pImageView.setImageResource(R.drawable.ic_guide_listview_up);
} else {
pviewHolder.pImageView.setImageResource(R.drawable.ic_guide_listview_down);
} return convertView;
} @Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
ViewGroup parent) {
ChildViewHolder cViewHolder; if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.child_item, parent, false);
cViewHolder = new ChildViewHolder();
cViewHolder.cTextView = (TextView)convertView.findViewById(R.id.child_item);
cViewHolder.cImageView = (ImageView) convertView.findViewById(R.id.child_delete);
convertView.setTag(cViewHolder);
} cViewHolder = (ChildViewHolder)convertView.getTag();
cViewHolder.cTextView.setText(datas.get(groupPosition).getChilds().get(childPosition).getcName()); final int gPosition = groupPosition;
final int cPosition = childPosition;
cViewHolder.cImageView.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Do you want to remove?");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
datas.get(gPosition).getChilds().remove(cPosition);
notifyDataSetChanged();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
}); return convertView;
} @Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
} static class ParentViewHolder {
TextView pTextView;
ImageView pImageView;
} static class ChildViewHolder {
TextView cTextView;
ImageView cImageView;
}
}
Activity
- ExpandableListView须要和自己定义adapter进行绑定,通过setAdapter方法。
- 默认ExpandableListView带了一个指示箭头。我们自己定义布局是不须要这个指示箭头的。能够使用expandableListView.setGroupIndicator(null);方法将其去掉。
- 设置setOnGroupExpandListener,当展开一个特定的group时,关闭其它group。
- 设置setOnChildClickListener,监听孩子点击事件。
package com.example.expandtutorial; import java.util.ArrayList; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.Toast; public class MainActivity extends Activity {
private ExpandableListView expandableListView;
private CustomerAdapter customerAdapter;
private ArrayList<ParentObj> listData = new ArrayList<ParentObj>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); createGroupData(); createChildData(); expandableListView = (ExpandableListView) findViewById(R.id.expandable_list_view_id);
customerAdapter = new CustomerAdapter(listData, this);
expandableListView.setAdapter(customerAdapter);
expandableListView.setGroupIndicator(null); expandableListView.setOnGroupExpandListener(new OnGroupExpandListener() { @Override
public void onGroupExpand(int groupPosition) {
for (int i = 0; i < customerAdapter.getGroupCount(); i ++) {
if (i != groupPosition) {
expandableListView.collapseGroup(i);
}
}
}
}); expandableListView.setOnChildClickListener(new OnChildClickListener() { @Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Toast.makeText(MainActivity.this, listData.get(groupPosition).getChilds().get(childPosition).getcName(), Toast.LENGTH_LONG).show();
return true;
}
});
} private void createGroupData() {
ParentObj p1 = new ParentObj();
p1.setpName("HP");
listData.add(p1); ParentObj p2 = new ParentObj();
p2.setpName("DELL");
listData.add(p2); ParentObj p3 = new ParentObj();
p3.setpName("Lenovo");
listData.add(p3); ParentObj p4 = new ParentObj();
p4.setpName("Sony");
listData.add(p4); ParentObj p5 = new ParentObj();
p5.setpName("HCL");
listData.add(p5); ParentObj p6 = new ParentObj();
p6.setpName("Samsung");
listData.add(p6);
} private void createChildData() {
// preparing laptops collection(child)
String[] hpModels = { "HP Pavilion G6-2014TX", "ProBook HP 4540", "HP Envy 4-1025TX" };
String[] hclModels = { "HCL S2101", "HCL L2102", "HCL V2002" };
String[] lenovoModels = { "IdeaPad Z Series", "Essential G Series", "ThinkPad X Series", "Ideapad Z Series" };
String[] sonyModels = { "VAIO E Series", "VAIO Z Series", "VAIO S Series", "VAIO YB Series" };
String[] dellModels = { "Inspiron", "Vostro", "XPS" };
String[] samsungModels = { "NP Series", "Series 5", "SF Series" }; for (ParentObj p : listData) {
if (p.getpName().equals("HP")) {
ArrayList<ChildObj> clists = new ArrayList<ChildObj>();
for (int i = 0; i < hpModels.length; i ++) {
ChildObj cObj = new ChildObj();
cObj.setcName(hpModels[i]);
clists.add(cObj);
}
p.setChilds(clists);
} else if (p.getpName().equals("DELL")) {
ArrayList<ChildObj> clists = new ArrayList<ChildObj>();
for (int i = 0; i < dellModels.length; i ++) {
ChildObj cObj = new ChildObj();
cObj.setcName(dellModels[i]);
clists.add(cObj);
}
p.setChilds(clists);
} else if (p.getpName().equals("Lenovo")) {
ArrayList<ChildObj> clists = new ArrayList<ChildObj>();
for (int i = 0; i < lenovoModels.length; i ++) {
ChildObj cObj = new ChildObj();
cObj.setcName(lenovoModels[i]);
clists.add(cObj);
}
p.setChilds(clists);
} else if (p.getpName().equals("Sony")) {
ArrayList<ChildObj> clists = new ArrayList<ChildObj>();
for (int i = 0; i < sonyModels.length; i ++) {
ChildObj cObj = new ChildObj();
cObj.setcName(sonyModels[i]);
clists.add(cObj);
}
p.setChilds(clists);
} else if (p.getpName().equals("HCL")) {
ArrayList<ChildObj> clists = new ArrayList<ChildObj>();
for (int i = 0; i < hclModels.length; i ++) {
ChildObj cObj = new ChildObj();
cObj.setcName(hclModels[i]);
clists.add(cObj);
}
p.setChilds(clists);
} else {
ArrayList<ChildObj> clists = new ArrayList<ChildObj>();
for (int i = 0; i < samsungModels.length; i ++) {
ChildObj cObj = new ChildObj();
cObj.setcName(samsungModels[i]);
clists.add(cObj);
}
p.setChilds(clists);
}
}
}
} class ParentObj {
private String pName;
private ArrayList<ChildObj> childs = new ArrayList<ChildObj>(); public String getpName() {
return pName;
} public void setpName(String pName) {
this.pName = pName;
} public ArrayList<ChildObj> getChilds() {
return childs;
} public void setChilds(ArrayList<ChildObj> childs) {
this.childs.clear();
this.childs.addAll(childs);
}
} class ChildObj {
private String cName; public String getcName() {
return cName;
} public void setcName(String cName) {
this.cName = cName;
}
}
源代码
Android:ExpandableListView使用的更多相关文章
- 【开源项目4】Android ExpandableListView
如果你对Android提供的Android ExpandableListView并不满意,一心想要实现诸如Spotify应用那般的效果,那么SlideExpandableListView绝对是你最好的 ...
- 【原创】Android ExpandableListView使用
ExpandableView的使用可以绑定到SimpleExpandableListAdapter,主要是看这个Adapter怎么用. 这个类默认的构造函数有9个参数, 很好地解释了什么叫做又臭又长. ...
- Android ExpandableListView
ExpandableListView 结合SimpleExpandableListAdapter用法 最终实现效果: activity_main.xml <?xml version=" ...
- android ExpandableListView详解
ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组 ...
- 解决android expandablelistview 里面嵌入gridview行数据重复问题
最近做了一个“csdn专家博客App” 当然了是android版本,在专家浏览页面,我才用了expandablelistview 组件来显示专家分类,每个分类点击之后可以显示专家的头像和名字. 很简单 ...
- Android ExpandableListView的下拉刷新实现
该控件的修改时根据PullToRefreshList的机制修改 下面是对ExpandableListView的扩展 package com.up91.gwy.view.componet; import ...
- Android ExpandableListView的技巧和问题
前言: 最近一个多月在认真的学习Android和做项目,文章内容表达的不好或者理解错了,希望大家评论指出. :-) 本文是总结几个比较常用且使用的技巧,和一个大家都会遇到的问题. 文章中大部分语句摘抄 ...
- Android ExpandableListView 带有Checkbox的简单应用
expandablelistview2_groups.xml <?xml version="1.0" encoding="utf-8"?> < ...
- Android ExpandableListView的简单应用
Expandablelistview1Activity.java package com.wangzhu.demoexpandablelistview; import java.util.ArrayL ...
- Android ExpandableListView使用+获取SIM卡状态信息
ExpandableListView 是一个可以实现下拉列表的控件,大家可能都用过QQ,QQ中的好友列表就是用ExpandableListView实现的,不过它是自定义的适配器.本篇 博客除了要介绍E ...
随机推荐
- Django day15 (一) cbv装饰器 , 中间件
一: 装饰器 二: 中间件
- 优先队列 + 并查集 + 字典树 + 欧拉回路 + 树状数组 + 线段树 + 线段树点更新 + KMP +AC自动机 + 扫描线
这里给出基本思想和实现代码 . 优先队列 : 曾经做过的一道例题 坦克大战 struct node { int x,y,step; friend bool operator <(no ...
- [NOI2015,LuoguP2146]软件包管理器------树剖
***题目链接戳我*** 又是在树上瞎搞滴题目.... 我们如果以安装的软件为1,未安装的软件为0,那么软件改变的数量即树上权值总和的数量,涉及到区间修改,区间查询,考虑树剖 分析完毕,似乎没啥好说的 ...
- python 11:range(起始索引,终止索引,步数)(默认情况下步数为1,生成从起始索引,每次增加(终止索引-起始索引)/步数,到终止索引前的数字串)
squares = [] for value in range(1,11): #第三参数默认为1,生成从1开始,每次增加1步数,到11前的10为止的数字串 square = value ** 2 sq ...
- Java 自定义线程池
Java 自定义线程池 https://www.cnblogs.com/yaoxiaowen/p/6576898.html public ThreadPoolExecutor(int corePool ...
- 基于bootstarp的Dailog
oaoDailog开发帮助 1. 帮助文档关键字 boostrap模态框oaoDailog 2. 使用场景 当网页上点击某个按钮需要给予用户提示确认,用户点击确认按钮才 ...
- 《CSS Mastery》 读书笔记 (1)
--本笔记中英混合,专业名词尽量不翻译,免得误解,如果不习惯,就不用往下看了,走好不送. 第一章 基础 人类的好奇心总是促使我们捣鼓,捣鼓是最好做有效的学习CSS的方法 In this chapter ...
- SEO之如何做301转向
1.如果网站使用的是(Linux+Apache+MySQL+PHP)主机,可以使用.htaccess文件做301转向 比如把/index.html 301转向到http://www.xinlvtian ...
- mysql数据库之存储过程入门
引用:百度百科 存储过程 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存 ...
- Hive2.1.1集群搭建
软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...