ExpandableListView
来源:互联网 发布:尤克里里淘宝网 编辑:程序博客网 时间:2024/06/05 03:59
ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开。
原文地址:http://my.oschina.net/amigos/blog/62614
重要方法:
expandGroup (
int
groupPos) ;
//在分组列表视图中 展开一组,
setSelectedGroup (
int
groupPosition) ;
//设置选择指定的组。
setSelectedChild (
int
groupPosition,
int
childPosition,
boolean
shouldExpandGroup);
//设置选择指定的子项。
getPackedPositionGroup (
long
packedPosition);
//返回所选择的组
getPackedPositionForChild (
int
groupPosition,
int
childPosition) ;
//返回所选择的子项
getPackedPositionType (
long
packedPosition);
//返回所选择项的类型(Child,Group)
isGroupExpanded (
int
groupPosition);
//判断此组是否展开
expandableListView.setDivider();这个是设定每个Group之间的分割线。
expandableListView.setGroupIndicator();这个是设定每个Group之前的那个图标。
expandableListView.collapseGroup(int group); 将第group组收起
ExpandableListAdapter
一个接口,将基础数据链接到一个ExpandableListView。 此接口的实施将提供访问Child的数据(由组分类),并实例化的Child和Group。
1.重要方法
getChildId (int groupPosition, int childPosition) 获取与在给定组给予孩子相关的数据。
getChildrenCount (int groupPosition) 返回在指定Group的Child数目。
案例:
首先定义个一个布局文件expandablelistview.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
=
"fill_parent"
android:orientation
=
"vertical"
>
<
ExpandableListView
android:id
=
"@+id/expandableListView"
android:layout_width
=
"fill_parent"
android:layout_height
=
"wrap_content"
>
</
ExpandableListView
>
</
LinearLayout
>
package
com.test;
import
java.util.ArrayList;
import
java.util.List;
import
javax.security.auth.PrivateCredentialPermission;
import
android.app.Activity;
import
android.os.Bundle;
import
android.view.Gravity;
import
android.view.View;
import
android.view.ViewGroup;
import
android.view.Window;
import
android.widget.AbsListView;
import
android.widget.BaseExpandableListAdapter;
import
android.widget.ExpandableListView;
import
android.widget.TextView;
public
class
ExpandableListViewDemo
extends
Activity {
/** Called when the activity is first created. */
//定义两个List用来控制Group和Child中的String;
private
List<String> groupArray;
//组列表
private
List<List<String>> childArray;
//子列表
private
ExpandableListView expandableListView_one;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
// requestWindowFeature(Window.FEATURE_NO_TITLE); //设置为无标题
setContentView(R.layout.expandablelistview);
expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);
groupArray =
new
ArrayList<String>();
childArray =
new
ArrayList<List<String>>();
/*-第一季-*/
initdate();
expandableListView_one.setAdapter(
new
ExpandableListViewaAdapter(ExpandableListViewDemo.
this
));
/*-第二季-*/
// groupArray.add("移动开发");
// List<String> arrayList = new ArrayList<String>();
// arrayList.add("Android");
// arrayList.add("IOS");
// arrayList.add("Windows Phone");
// //组循环
// for(int index=0;index<groupArray.size();++index)
// {
// childArray.add(arrayList);
// }
// expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));
}
class
ExpandableListViewaAdapter
extends
BaseExpandableListAdapter {
Activity activity;
public
ExpandableListViewaAdapter(Activity a)
{
activity = a;
}
/*-----------------Child */
@Override
public
Object getChild(
int
groupPosition,
int
childPosition) {
// TODO Auto-generated method stub
return
childArray.get(groupPosition).get(childPosition);
}
@Override
public
long
getChildId(
int
groupPosition,
int
childPosition) {
// TODO Auto-generated method stub
return
childPosition;
}
@Override
public
View getChildView(
int
groupPosition,
int
childPosition,
boolean
isLastChild, View convertView, ViewGroup parent) {
String string =childArray.get(groupPosition).get(childPosition);
return
getGenericView(string);
}
@Override
public
int
getChildrenCount(
int
groupPosition) {
// TODO Auto-generated method stub
return
childArray.get(groupPosition).size();
}
/* ----------------------------Group */
@Override
public
Object getGroup(
int
groupPosition) {
// TODO Auto-generated method stub
return
getGroup(groupPosition);
}
@Override
public
int
getGroupCount() {
// TODO Auto-generated method stub
return
groupArray.size();
}
@Override
public
long
getGroupId(
int
groupPosition) {
// TODO Auto-generated method stub
return
groupPosition;
}
@Override
public
View getGroupView(
int
groupPosition,
boolean
isExpanded,
View convertView, ViewGroup parent) {
String string=groupArray.get(groupPosition);
return
getGenericView(string);
}
@Override
public
boolean
hasStableIds() {
// TODO Auto-generated method stub
return
false
;
}
@Override
public
boolean
isChildSelectable(
int
groupPosition,
int
childPosition)
{
// TODO Auto-generated method stub
return
true
;
}
private
TextView getGenericView(String string )
{
AbsListView.LayoutParams layoutParams =
new
AbsListView.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
TextView textView =
new
TextView(activity);
textView.setLayoutParams(layoutParams);
textView.setGravity(Gravity.CENTER_VERTICAL |Gravity.LEFT);
textView.setPadding(
40
,
0
,
0
,
0
);
textView.setText(string);
return
textView;
}
}
private
void
initdate()
{
addInfo(
"语言"
,
new
String[]{
"Oracle"
,
"Java"
,
"Linux"
,
"Jquery"
});
addInfo(
"男人的需求"
,
new
String[]{
"金钱"
,
"事业"
,
"权力"
,
"女人"
,
"房子"
,
"车"
,
"球"
});
}
private
void
addInfo(String group,String []child) {
groupArray.add(group);
List<String> childItem =
new
ArrayList<String>();
for
(
int
index=
0
;index<child.length;index++)
{
childItem.add(child[index]);
}
childArray.add(childItem);
}
}
运行效果:
注释修改如下代码:
/*-第一季-*/
// initdate();
// expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));
/*-第二季-*/
groupArray.add(
"移动开发"
);
List<String> arrayList =
new
ArrayList<String>();
arrayList.add(
"Android"
);
arrayList.add(
"IOS"
);
arrayList.add(
"Windows Phone"
);
//组循环
for
(
int
index=
0
;index<groupArray.size();++index)
{
childArray.add(arrayList);
}
expandableListView_one.setAdapter(
new
ExpandableListViewaAdapter(ExpandableListViewDemo.
this
));
运行效果:
★★★★★★★★★★★★★★★★★★★★
案例二:
1.定义一个主界面expandablelistview.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=
"fill_parent"
android:orientation=
"vertical"
>
<ExpandableListView
android:id =
"@+id/expandableListView"
android:layout_width =
"fill_parent"
android:layout_height =
"wrap_content"
>
</ExpandableListView>
</LinearLayout>
2.在res/drawable目录下创建样式文件expandablelistview_groups.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
=
"fill_parent"
android:orientation
=
"vertical"
>
<
TextView
android:id
=
"@+id/textGroup"
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
android:paddingLeft
=
"40px"
android:paddingTop
=
"6px"
android:paddingBottom
=
"6px"
android:textSize
=
"15sp"
android:text
=
"No data"
>
</
TextView
>
</
LinearLayout
>
3.在res/drawable目录下创建样式文件expandablelistview_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
=
"fill_parent"
android:orientation
=
"vertical"
>
<
TextView
android:id
=
"@+id/textChild"
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
android:paddingLeft
=
"60px"
android:paddingTop
=
"10px"
android:paddingBottom
=
"10px"
android:textSize
=
"20sp"
android:text
=
"No Data"
/>
</
LinearLayout
>
定义java文件:ExpandableListViewDemo_two.java
package
com.test;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.List;
import
java.util.Map;
import
javax.security.auth.PrivateCredentialPermission;
import
com.test.R;
import
com.test.ExpandableListViewDemo.ExpandableListViewaAdapter;
import
com.test.R.id;
import
com.test.R.layout;
import
android.app.Activity;
import
android.os.Bundle;
import
android.view.Gravity;
import
android.view.View;
import
android.view.ViewGroup;
import
android.view.Window;
import
android.widget.AbsListView;
import
android.widget.BaseExpandableListAdapter;
import
android.widget.ExpandableListView;
import
android.widget.SimpleExpandableListAdapter;
import
android.widget.TextView;
public
class
ExpandableListViewDemo_two
extends
Activity {
/** Called when the activity is first created. */
private
ExpandableListView expandableListView_one;
@Override
public
void
onCreate(Bundle savedInstanceState)
{
super
.onCreate(savedInstanceState);
setContentView(R.layout.expandablelistview);
expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);
//创建二个一级条目标题
Map<String, String> title_1 =
new
HashMap<String, String>();
Map<String, String> title_2 =
new
HashMap<String, String>();
title_1.put(
"group"
,
"移动开发"
);
title_2.put(
"group"
,
"男人的需求"
);
//创建一级条目容器
List<Map<String, String>> gruops =
new
ArrayList<Map<String,String>>();
gruops.add(title_1);
gruops.add(title_2);
//创建二级条目内容
//内容一
Map<String, String> content_1 =
new
HashMap<String, String>();
Map<String, String> content_2 =
new
HashMap<String, String>();
content_1.put(
"child"
,
"ANDROID"
);
content_2.put(
"child"
,
"IOS"
);
List<Map<String, String>> childs_1 =
new
ArrayList<Map<String,String>>();
childs_1.add(content_1);
childs_1.add(content_2);
//内容二
Map<String, String> content_3 =
new
HashMap<String, String>();
Map<String, String> content_4 =
new
HashMap<String, String>();
Map<String, String> content_5 =
new
HashMap<String, String>();
content_3.put(
"child"
,
"金钱"
);
content_4.put(
"child"
,
"权力"
);
content_5.put(
"child"
,
"女人"
);
List<Map<String, String>> childs_2 =
new
ArrayList<Map<String,String>>();
childs_2.add(content_3);
childs_2.add(content_4);
childs_2.add(content_5);
//存放两个内容, 以便显示在列表中
List<List<Map<String, String>>> childs =
new
ArrayList<List<Map<String,String>>>();
childs.add(childs_1);
childs.add(childs_2);
//创建ExpandableList的Adapter容器
/**
* 使用SimpleExpandableListAdapter显示ExpandableListView
* 参数
1
.上下文对象Context
* 参数
2
.一级条目目录集合
* 参数
3
.一级条目对应的布局文件 (expandablelistview_groups.xml文件
* 参数
4
.fromto,就是map中的key,指定要显示的对象
* 参数
5
.与参数
4
对应,指定要显示在groups中的id
* 参数
6
.二级条目目录集合
* 参数
7
.二级条目对应的布局文件
* 参数
9
.与参数
8
对应,指定要显示在childs中的id
/ SimpleExpandableListAdapter adapter =
new
SimpleExpandableListAdapter(
this
, gruops, R.drawable.expandablelistview_groups,
new
String[]{
"group"
},
new
int
[]{R.id.textGroup},
childs, R.drawable.expandablelistview_child,
new
String[]{
"child"
},
new
int
[]{R.id.textChild}
);
//加入列表
expandableListView_one.setAdapter(adapter);
expandableListView_one.setOnChildClickListener(listener);
}
private
OnChildClickListener listener =
new
OnChildClickListener() {
@Override
public
boolean
onChildClick(ExpandableListView parent, View v,
int
groupPosition,
int
childPosition,
long
id) {
// TODO Auto-generated method stub
toast(
"点击了"
);
return
false
;
}
};
private
void
toast(String str) {
Toast.makeText(
this
, str, Toast.LENGTH_LONG).show();
}
}
上面的样式也可以使用系统的自带的样式如下:
android.R.layout.simple_expandable_list_item_1,//层显示样式 ,系统自定义
android.R.layout.simple_expandable_list_item_2,
运行效果:
案例三:如果group中有个ImageVIew将会是什么情况呢?
在SimpleExpandableListAdapter中有如下方法:
private
void
bindView(View view, Map<String, ?> data, String[] from,
int
[] to) {
int
len = to.length;
for
(
int
i =
0
; i < len; i++) {
TextView v = (TextView)view.findViewById(to[i]);
if
(v !=
null
) {
v.setText((String)data.get(from[i]));
}
}
}
从上面的方法中可以看出 SimpleExpandableListAdapter把所以的View都当成TextView来处理了,而不像SimpleAdapter可以自动判断View的类型,自动绑定,解决版本就是重写bingview回调一下试试:
public
class
MyExpandableListAdapter
extends
BaseExpandableListAdapter{
private
void
bindView(View view, Map<String, ?> data, String[] from,
int
[] to) {
int
len = to.length;
boolean
isBound =
false
;
for
(
int
i =
0
; i < len; i++) {
final
View v = view.findViewById(to[i]);
if
(v!=
null
) {
final
Object _data = data.get(from[i]);
String text = _data ==
null
?
""
: data.toString();
if
(text ==
null
) {
text =
""
;
}
if
(mViewBinder !=
null
) {
//如果Binder不为空,使用Binder进行处理
isBound = mViewBinder.setViewValue(v, data.get(from[i]), text);
}
if
(!isBound) {
//如果Binder跳过,使用原来的方法进行处理
TextView _v = (TextView)v;
_v.setText((String)data.get(from[i]));
}
}
}
}
}
- ExpandableListView
- ExpandableListView
- ExpandableListView
- ExpandableListView
- ExpandableListView
- ExpandableListView
- expandableListView
- ExpandableListView
- expandablelistview
- ExpandableListview
- ExpandableListView
- ExpandableListView
- ExpandableListView
- Expandablelistview
- ExpandableListView
- ExpandableListView
- ExpandableListView
- ExpandableListView
- lightoj1219Mafia
- 我的完全自己写的一个程序
- 明氏距离
- 判断用于使用哪个渠道进行联网
- 15.11.25
- ExpandableListView
- mac 下phone gap 安装
- select 和 epoll区别
- webservice简单学习笔记
- 常量字符数组的使用
- java_JDBC连接数据库代码大全
- mac下xampp运行thinkphp错误403解决方案
- 指令汇B新闻客户端开发(二) 主页面布局
- Thrift交流(一)简单的Thrift