本文实例讲述了android编程实现二级下拉菜单及快速搜索的方法。分享给大家供大家参考,具体如下:
一、我们要做什么?
上面有个搜索框,下面是一个二级下拉菜单。
输入查询内容,下面列表将显示查询结果。
二、界面设计
(1)这是主框架(部分属性已经省去,请看源码),从上至下分别是文本框,列表,二级列表。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?xml version= "1.0" encoding= "utf-8" ?> <linearlayout> <linearlayout android:id= "@+id/city_middle" > <edittext android:id= "@+id/txtfind" android:hint= "请输入" > </edittext> <listview android:id= "@+id/listfind" > </listview> <expandablelistview android:id= "@+id/exlist" /> </linearlayout> </linearlayout> |
(2)一级菜单栏样式,图片将区别是否展开
1
2
3
4
5
6
7
8
9
|
<?xml version= "1.0" encoding= "utf-8" ?> <linearlayout > <textview android:id= "@+id/group" > </textview> <imageview android:id= "@+id/tubiao" > </imageview> </linearlayout> |
(3)二级菜单栏样式
1
2
3
4
5
6
|
<?xml version= "1.0" encoding= "utf-8" ?> <linearlayout > <textview android:id= "@+id/child" > </textview> </linearlayout> |
三、代码设计
(1) 定义菜单对应数据
1
2
|
public static list<basicnamevaluepair> fatherlist = new arraylist<basicnamevaluepair>(); public static list<list<basicnamevaluepair>> childlist = new arraylist<list<basicnamevaluepair>>(); |
生成测试数据
1
2
3
4
5
6
7
8
9
|
for ( int i = 0 ; i < 20 ; i++) { fatherlist.add( new basicnamevaluepair( "father" + i, "father" + i)); list<basicnamevaluepair> clist = new arraylist<basicnamevaluepair>(); for ( int j = 0 ; j < 5 ; j++) { clist.add( new basicnamevaluepair( "child" + i + ":" + j, "child" + i + ":" + j)); } childlist.add(clist); } |
(2)定义列表适配器
- protected class listadapter extends baseadapter {
- private layoutinflater minflater;
- //查询结果列表
- private list<basicnamevaluepair> list = new arraylist<basicnamevaluepair>();
- public listadapter(context context, string strin) {
- minflater = layoutinflater.from(context);
- //查询匹配
- for (int i = 0; i < childlist.size(); i++) {
- for (int j = 0; j < childlist.get(i).size(); j++) {
- string tmp = childlist.get(i).get(j).getvalue();
- if (tmp.indexof(strin) >= 0) {
- list.add(new basicnamevaluepair(childlist.get(i).get(j)
- .getname(), tmp));
- }
- }
- }
- }
- public int getcount() {
- return list.size();
- }
- public object getitem(int position) {
- return position;
- }
- public long getitemid(int position) {
- return position;
- }
- public view getview(final int position, view convertview,
- viewgroup parent) {
- convertview = minflater.inflate(r.layout.child, null);
- textview title = (textview) convertview.findviewbyid(r.id.child);
- title.settext(list.get(position).getvalue());
- return convertview;
- }
- }
初始化列表,默认为隐藏
- list = (listview) findviewbyid(r.id.listfind);
- list.setvisibility(view.gone);
(3)定义二级列表适配器
- protected class exadapter extends baseexpandablelistadapter {
- @override
- public int getgroupcount() {
- return fatherlist.size();
- }
- @override
- public int getchildrencount(int groupposition) {
- return childlist.get(groupposition).size();
- }
- @override
- public object getgroup(int groupposition) {
- return fatherlist.get(groupposition).getvalue();
- }
- @override
- public object getchild(int groupposition, int childposition) {
- return childlist.get(groupposition).get(childposition).getvalue();
- }
- @override
- public long getgroupid(int groupposition) {
- return groupposition;
- }
- @override
- public long getchildid(int groupposition, int childposition) {
- return childposition;
- }
- @override
- public view getgroupview(int groupposition, boolean isexpanded,
- view convertview, viewgroup parent) {
- view view = convertview;
- if (view == null) {
- layoutinflater inflater = (layoutinflater) getsystemservice(context.layout_inflater_service);
- view = inflater.inflate(r.layout.group, null);
- }
- textview t = (textview) view.findviewbyid(r.id.group);
- t.settext(fatherlist.get(groupposition).getvalue());
- //展开,改变图片
- imageview gimg = (imageview) view.findviewbyid(r.id.tubiao);
- if (isexpanded)
- gimg.setbackgroundresource(r.drawable.mm_submenu_down_normal);
- else
- gimg.setbackgroundresource(r.drawable.mm_submenu_normal);
- return view;
- }
- @override
- public view getchildview(int groupposition, int childposition,
- boolean islastchild, view convertview, viewgroup parent) {
- view view = convertview;
- if (view == null) {
- layoutinflater inflater = (layoutinflater) getsystemservice(context.layout_inflater_service);
- view = inflater.inflate(r.layout.child, null);
- }
- textview t = (textview) view.findviewbyid(r.id.child);
- t.settext(childlist.get(groupposition).get(childposition)
- .getvalue());
- return view;
- }
- @override
- public boolean hasstableids() {
- return true;
- }
- @override
- public boolean ischildselectable(int groupposition, int childposition) {
- return true;
- }
- }
初始化二级菜单
- exlist = (expandablelistview) findviewbyid(r.id.exlist);
- exlist.setadapter(new exadapter());
- exlist.setgroupindicator(null);
- exlist.setdivider(null);
(4)搜索事件,输入改变即触发
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
txtfind = (edittext) findviewbyid(r.id.txtfind); txtfind.addtextchangedlistener( new textwatcher() { @override public void beforetextchanged(charsequence s, int start, int count, int after) { } @override public void ontextchanged(charsequence s, int start, int before, int count) { } @override public void aftertextchanged(editable s) { if (s != null && !s.tostring().equals( "" )) { list.setadapter( new listadapter(dwinterdemoactivity. this , s .tostring())); list.setvisibility(view.visible); exlist.setvisibility(view.gone); } else { list.setvisibility(view.gone); exlist.setvisibility(view.visible); } } }); |
(5)去除焦点自动弹出输入
1
2
|
getwindow().setsoftinputmode( windowmanager.layoutparams.soft_input_state_always_hidden); |
希望本文所述对大家android程序设计有所帮助。