Android中ExpandableList的使用2
本文介绍Android中ExpandableList的使用,在前文的基础上作了很多改进,增加了增加、删除、回调等功能。
图中的 “第一行班组号: 1 软件工程2班”是要显示的信息。
先看效果图:
首先定义一个含有ExpandableListView的Layout。还有一个是显示的文本信息。
<RelativeLayout 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:paddingBottom=
"@dimen/activity_vertical_margin"
android:paddingLeft=
"@dimen/activity_horizontal_margin"
android:paddingRight=
"@dimen/activity_horizontal_margin"
android:paddingTop=
"@dimen/activity_vertical_margin"
tools:context=
".MainActivity"
>
<TextView
android:id=
"@+id/textView1"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"@string/hello_world"
/>
<ExpandableListView
android:id=
"@+id/expandableListView1"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_alignLeft=
"@+id/textView1"
android:layout_below=
"@+id/textView1"
android:layout_marginTop=
"52dp"
>
</ExpandableListView>
</RelativeLayout>
|
2、为ExpandableListView准备数据源。
ClassGroups列表,定义了所有的班级。
ClassDetails定义班级的详细信息。包括班级编号,班级名称,班级人数,以及老师。
private
List<String> ClassGroups =
new
ArrayList<String>();
private
List<List<String>> ClassDetails =
new
ArrayList<List<String>>();
private
String[][] ClassDetailsSource = {
{
"20100801"
,
"软件工程1班"
,
"50"
,
"王老师"
},
{
"20100802"
,
"软件工程2班"
,
"47"
,
"理老师"
},
{
"20100803"
,
"网络工程1班"
,
"52"
}, {
"20100804"
,
"计算机科学与技术"
}
};
|
通过addItem方法,初始化四个班级。
private
void
parepareDataSource() {
for
(
int
i =
0
; i <
4
; i++) {
addItem(
"班组号:"
+i, ClassDetailsSource[i]);
}
}
|
将所有的班级添加的ClassDetails中。
private
void
addItem(String string, String[] data) {
// TODO Auto-generated method stub
ClassGroups.add(string);
List<String> item =
new
ArrayList<String>();
for
(
int
i =
0
; i < data.length; i++) {
item.add(data[i]);
}
ClassDetails.add(item);
}
|
3、使用BaseExpandableListAdapter绑定数据源。这个在我的上一篇文章中以及介绍过了,这里不在介绍。
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parepareDataSource();
tView = (TextView) findViewById(R.id.textView1);
expandableListView = (ExpandableListView) findViewById(R.id.expandableListView1);
expandableListView.setAdapter(
new
ExpandableListAdapter());
//ExpandableListView的回调函数 用于监听那个id 被expand
expandableListView.setOnGroupClickListener(
new
OnGroupClickListener() {
@Override
public
boolean
onGroupClick(ExpandableListView parent, View v,
int
groupPosition,
long
id) {
// TODO Auto-generated method stub
Toast.makeText(ExpandableList3.
this
,
"You Click "
+ groupPosition +
" Group"
, Toast.LENGTH_LONG).show();
return
false
;
}
});
expandableListView.setOnChildClickListener(
new
OnChildClickListener() {
@Override
public
boolean
onChildClick(ExpandableListView parent, View v,
int
groupPosition,
int
childPosition,
long
id) {
// TODO Auto-generated method stub
Toast.makeText(ExpandableList3.
this
,
"You Click "
+ childPosition +
" child in group"
+ groupPosition, Toast.LENGTH_LONG).show();
return
false
;
}
});
}
|
注:expandableListView.setOnGroupClickListener(new OnGroupClickListener())和expandableListView.setOnChildClickListener(new OnChildClickListener())是回调方法,等会再讲。
下面是ExpandableListAdapter的数据源形式为:
public
class
ExpandableListAdapter
extends
BaseExpandableListAdapter {
@Override
public
boolean
isChildSelectable(
int
groupPosition,
int
childPosition) {
// TODO Auto-generated method stub
String string = ClassGroups.get(groupPosition)
+ ClassDetails.get(groupPosition).get(childPosition); <br> tView.setText(string);
return
true
;
}
@Override
public
boolean
hasStableIds() {
// TODO Auto-generated method stub
return
true
;
}
@Override
public
View getGroupView(
int
groupPosition,
boolean
isExpanded,
View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
LinearLayout layout =
new
LinearLayout(ExpandableList3.
this
);
layout.setOrientation(
0
);
layout.setPadding(
50
,
0
,
0
,
0
);
ImageView imageView =
new
ImageView(ExpandableList3.
this
);
imageView.setImageResource(R.drawable.ic_launcher);
layout.addView(imageView);
TextView textView = getTextView();
textView.setText(getGroup(groupPosition).toString());
layout.addView(textView);
return
layout;
}
private
TextView getTextView() {
// TODO Auto-generated method stub
AbsListView.LayoutParams lParams =
new
AbsListView.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
64
);
TextView textView =
new
TextView(ExpandableList3.
this
);
textView.setLayoutParams(lParams);
textView.setPadding(
20
,
0
,
0
,
0
);
textView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
return
textView;
}
@Override
public
long
getGroupId(
int
groupPosition) {
// TODO Auto-generated method stub
return
groupPosition;
}
@Override
public
int
getGroupCount() {
// TODO Auto-generated method stub
return
ClassGroups.size();
}
@Override
public
Object getGroup(
int
groupPosition) {
// TODO Auto-generated method stub
return
ClassGroups.get(groupPosition);
}
@Override
public
int
getChildrenCount(
int
groupPosition) {
// TODO Auto-generated method stub
return
ClassDetails.get(groupPosition).size(); <br> }
@Override
public
View getChildView(
int
groupPosition,
int
childPosition,
boolean
isLastChild, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView textView = getTextView();
textView.setText(getChild(groupPosition, childPosition).toString());
return
textView;
}
@Override
public
long
getChildId(
int
groupPosition,
int
childPosition) {
// TODO Auto-generated method stub
return
childPosition;
}
@Override
public
Object getChild(
int
groupPosition,
int
childPosition) {
// TODO Auto-generated method stub
return
ClassDetails.get(groupPosition).get(childPosition); }
};
|
二、创建两个Menu,分别调用各自的方法,一个是创建班级dialog, 一个是创建删除Dialog. 分别对应增加班级信息和删除班级信息
@Override
public
boolean
onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
menu.add(Menu.NONE, Menu.FIRST +
1
,
1
,
"Add"
).setIcon(
R.drawable.ic_launcher);
menu.add(Menu.NONE, Menu.FIRST +
2
,
2
,
"Delete"
).setIcon(
R.drawable.ic_launcher);
return
true
;
}
@Override
public
boolean
onOptionsItemSelected(MenuItem item) {
switch
(item.getItemId()) {
case
Menu.FIRST +
1
:
createAddDialog();
break
;
case
Menu.FIRST +
2
:
createDeleteDialog();
break
;
}
return
false
;
}
|
1、增加的Layout add_item.xml如下:分别放了四个文本,和文本框,一个确定,一个取消按钮。
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_margin=
"5dp"
android:text=
"班级号"
/>
<EditText
android:id=
"@+id/add_item1"
android:layout_width=
"200dip"
android:layout_height=
"wrap_content"
android:layout_margin=
"5dp"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_margin=
"5dp"
android:text=
"班级名"
/>
<EditText
android:id=
"@+id/add_item2"
android:layout_width=
"200dip"
android:layout_height=
"wrap_content"
android:layout_margin=
"5dp"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_margin=
"5dp"
android:text=
"班级人数"
/>
<EditText
android:id=
"@+id/add_item3"
android:layout_width=
"200dip"
android:layout_height=
"wrap_content"
android:layout_margin=
"5dp"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_margin=
"5dp"
android:text=
"老师"
/>
<EditText
android:id=
"@+id/add_item4"
android:layout_width=
"200dip"
android:layout_height=
"wrap_content"
android:layout_margin=
"5dp"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<Button
android:id=
"@+id/ok"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_margin=
"5dp"
android:text=
"ok"
/>
<Button
android:id=
"@+id/cancle"
android:layout_width=
"200dip"
android:layout_height=
"wrap_content"
android:layout_margin=
"5dp"
android:text=
"cancle"
/>
</LinearLayout>
</LinearLayout>
|
2、增加的代码如下:通过addItem(class_no.getText().toString(), data);方法,将添加班级信息。取消按钮时关闭当前Dialog.
private
EditText class_no;
private
EditText class_name;
private
EditText stu_num;
private
EditText teacher;
private
Dialog addDialog;
public
void
createAddDialog() {
View addView = getLayoutInflater().inflate(R.layout.add_item,
null
);
addDialog =
new
Dialog(
this
);
addDialog.setContentView(addView);
addDialog.setTitle(
"Add class dialog"
);
class_no = (EditText) addView.findViewById(R.id.add_item1);
class_name = (EditText) addView.findViewById(R.id.add_item2);
stu_num = (EditText) addView.findViewById(R.id.add_item3);
teacher = (EditText) addView.findViewById(R.id.add_item4);
Button ok = (Button) addView.findViewById(R.id.ok);
Button cancle = (Button) addView.findViewById(R.id.cancle);
ok.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
// TODO Auto-generated method stub
String[] data = { class_no.getText().toString(),
class_name.getText().toString(), stu_num.getText().toString(),
teacher.getText().toString() };
addItem(class_no.getText().toString(), data);
addDialog.dismiss();
}
});
cancle.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
// TODO Auto-generated method stub
addDialog.dismiss();
}
});
addDialog.show();
}
|
3、增加的效果图如下:
4、同理删除的Layout为delete_item.xml
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation=
"vertical"
>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"删除的班组编号:"
/>
<EditText
android:id=
"@+id/delete_id"
android:layout_width=
"200dip"
android:layout_height=
"wrap_content"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<Button
android:id=
"@+id/delete"
android:layout_width=
"90dip"
android:layout_height=
"wrap_content"
android:text=
"Delete"
/>
<Button
android:id=
"@+id/cancle_delete"
android:layout_width=
"90dip"
android:layout_height=
"wrap_content"
android:text=
"Canlce"
/>
</LinearLayout>
</LinearLayout>
|
5、 删除的代码为:输入编号: 如2, 则将班组号为2的班级所有信息删除。调用了ClassGroups.remove(i);ClassDetails.remove(i);方法。
Dialog deleteDialog;
EditText delete_group_id;
public
void
createDeleteDialog() {
View deleteView = getLayoutInflater().inflate(R.layout.delete_item,
null
);
deleteDialog =
new
Dialog(
this
);
deleteDialog.setContentView(deleteView);
deleteDialog.setTitle(
"Delete class dialog"
);
delete_group_id = (EditText) deleteView.findViewById(R.id.delete_id);
Button ok = (Button) deleteView.findViewById(R.id.delete);
Button cancle = (Button) deleteView.findViewById(R.id.cancle_delete);
ok.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
// TODO Auto-generated method stub
String deleteId = delete_group_id.getText().toString();
if
(!deleteId.equals(
""
)) {
int
i = Integer.parseInt(deleteId);
ClassGroups.remove(i);
ClassDetails.remove(i);
}
deleteDialog.dismiss();
}
});
cancle.setOnClickListener(
new
OnClickListener() {
@Override
public
void
onClick(View v) {
// TODO Auto-generated method stub
deleteDialog.dismiss();
}
});
deleteDialog.show();
}
|
6、删除的效果图如下:
三、回调函数的使用。
当单击组时,显示组的信息。单击子项的信息,显示组合子项的信息。如第一张图右下角显示的信息。
//ExpandableListView的回调函数 用于监听那个id 被expand
expandableListView.setOnGroupClickListener(
new
OnGroupClickListener() {
@Override
public
boolean
onGroupClick(ExpandableListView parent, View v,
int
groupPosition,
long
id) {
// TODO Auto-generated method stub
Toast.makeText(ExpandableList3.
this
,
"You Click "
+ groupPosition +
" Group"
, Toast.LENGTH_LONG).show();
return
false
;
}
});
expandableListView.setOnChildClickListener(
new
OnChildClickListener() {
@Override
public
boolean
onChildClick(ExpandableListView parent, View v,
int
groupPosition,
int
childPosition,
long
id) {
// TODO Auto-generated method stub
Toast.makeText(ExpandableList3.
this
,
"You Click "
+ childPosition +
" child in group"
+ groupPosition, Toast.LENGTH_LONG).show();
return
false
;
}
});
|
ExpandableList的使用就介绍到这里。本文也是对自己学习情况的记录,方便以后再次学习。
本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/archive/2013/03/25/2980959.html,如需转载请自行联系原作者