Android编程实现二级下拉菜单及快速搜索的方法

时间:2021-10-15 20:56:43

本文实例讲述了android编程实现二级下拉菜单及快速搜索的方法。分享给大家供大家参考,具体如下:

一、我们要做什么?

Android编程实现二级下拉菜单及快速搜索的方法

上面有个搜索框,下面是一个二级下拉菜单。

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)定义列表适配器

  1. protected class listadapter extends baseadapter { 
  2.   private layoutinflater minflater; 
  3.   //查询结果列表 
  4.   private list<basicnamevaluepair> list = new arraylist<basicnamevaluepair>(); 
  5.   public listadapter(context context, string strin) { 
  6.    minflater = layoutinflater.from(context); 
  7.    //查询匹配 
  8.    for (int i = 0; i < childlist.size(); i++) { 
  9.     for (int j = 0; j < childlist.get(i).size(); j++) { 
  10.      string tmp = childlist.get(i).get(j).getvalue(); 
  11.      if (tmp.indexof(strin) >= 0) { 
  12.       list.add(new basicnamevaluepair(childlist.get(i).get(j) 
  13.         .getname(), tmp)); 
  14.      } 
  15.     } 
  16.    } 
  17.   } 
  18.   public int getcount() { 
  19.    return list.size(); 
  20.   } 
  21.   public object getitem(int position) { 
  22.    return position; 
  23.   } 
  24.   public long getitemid(int position) { 
  25.    return position; 
  26.   } 
  27.   public view getview(final int position, view convertview, 
  28.     viewgroup parent) { 
  29.    convertview = minflater.inflate(r.layout.child, null); 
  30.    textview title = (textview) convertview.findviewbyid(r.id.child); 
  31.    title.settext(list.get(position).getvalue()); 
  32.    return convertview; 
  33.   } 
  34.  } 

初始化列表,默认为隐藏

  1. list = (listview) findviewbyid(r.id.listfind); 
  2. list.setvisibility(view.gone); 

(3)定义二级列表适配器

  1. protected class exadapter extends baseexpandablelistadapter { 
  2.   @override 
  3.   public int getgroupcount() { 
  4.    return fatherlist.size(); 
  5.   } 
  6.   @override 
  7.   public int getchildrencount(int groupposition) { 
  8.    return childlist.get(groupposition).size(); 
  9.   } 
  10.   @override 
  11.   public object getgroup(int groupposition) { 
  12.    return fatherlist.get(groupposition).getvalue(); 
  13.   } 
  14.   @override 
  15.   public object getchild(int groupposition, int childposition) { 
  16.    return childlist.get(groupposition).get(childposition).getvalue(); 
  17.   } 
  18.   @override 
  19.   public long getgroupid(int groupposition) { 
  20.    return groupposition; 
  21.   } 
  22.   @override 
  23.   public long getchildid(int groupposition, int childposition) { 
  24.    return childposition; 
  25.   } 
  26.   @override 
  27.   public view getgroupview(int groupposition, boolean isexpanded, 
  28.     view convertview, viewgroup parent) { 
  29.    view view = convertview; 
  30.    if (view == null) { 
  31.     layoutinflater inflater = (layoutinflater) getsystemservice(context.layout_inflater_service); 
  32.     view = inflater.inflate(r.layout.group, null); 
  33.    } 
  34.    textview t = (textview) view.findviewbyid(r.id.group); 
  35.    t.settext(fatherlist.get(groupposition).getvalue()); 
  36.    //展开,改变图片 
  37.    imageview gimg = (imageview) view.findviewbyid(r.id.tubiao); 
  38.    if (isexpanded) 
  39.     gimg.setbackgroundresource(r.drawable.mm_submenu_down_normal); 
  40.    else 
  41.     gimg.setbackgroundresource(r.drawable.mm_submenu_normal); 
  42.    return view; 
  43.   } 
  44.   @override 
  45.   public view getchildview(int groupposition, int childposition, 
  46.     boolean islastchild, view convertview, viewgroup parent) { 
  47.    view view = convertview; 
  48.    if (view == null) { 
  49.     layoutinflater inflater = (layoutinflater) getsystemservice(context.layout_inflater_service); 
  50.     view = inflater.inflate(r.layout.child, null); 
  51.    } 
  52.    textview t = (textview) view.findviewbyid(r.id.child); 
  53.    t.settext(childlist.get(groupposition).get(childposition) 
  54.      .getvalue()); 
  55.    return view; 
  56.   } 
  57.   @override 
  58.   public boolean hasstableids() { 
  59.    return true
  60.   } 
  61.   @override 
  62.   public boolean ischildselectable(int groupposition, int childposition) { 
  63.    return true
  64.   } 

初始化二级菜单

  1. exlist = (expandablelistview) findviewbyid(r.id.exlist); 
  2. exlist.setadapter(new exadapter()); 
  3. exlist.setgroupindicator(null); 
  4. 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程序设计有所帮助。