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

作者:越冬越酷 时间:2021-06-17 23:23:07 

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

一、我们要做什么?

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

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

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

输入查询内容,下面列表将显示查询结果。

二、界面设计

(1)这是主框架(部分属性已经省去,请看源码),从上至下分别是文本框,列表,二级列表。


<?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)一级菜单栏样式,图片将区别是否展开


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout >
<TextView
 android:id="@+id/group" >
</TextView>
<ImageView
 android:id="@+id/tubiao">
</ImageView>
</LinearLayout>

(3)二级菜单栏样式


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout >
<TextView
 android:id="@+id/child">
</TextView>
</LinearLayout>

三、代码设计

(1) 定义菜单对应数据


public static List<BasicNameValuePair> fatherList = new ArrayList<BasicNameValuePair>();
public static List<List<BasicNameValuePair>> childList = new ArrayList<List<BasicNameValuePair>>();

生成测试数据


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)搜索事件,输入改变即触发


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)去除焦点自动弹出输入


getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

希望本文所述对大家Android程序设计有所帮助。

标签:Android,下拉菜单,搜索
0
投稿

猜你喜欢

  • c# 编写的简单飞行棋游戏

    2022-12-05 05:10:59
  • IDEA使用Gradle构建SpringBoot项目工程的详细教程

    2022-08-31 16:28:26
  • spring boot中配置hikari连接池属性方式

    2022-11-13 06:06:44
  • struts2单个文件上传的两种实现方式

    2023-04-23 05:33:30
  • Android-Service实现手机壁纸自动更换

    2022-05-21 23:15:35
  • 详解Android性能优化之启动优化

    2023-07-16 06:00:07
  • java实现mongodb的数据库连接池

    2023-11-23 14:23:09
  • JAVA Spring中让人头痛的JAVA大事务问题要如何解决你知道吗

    2023-01-14 04:58:04
  • C# 9.0新特性——扩展方法GetEnumerator支持foreach循环

    2021-08-27 22:38:09
  • c# 实现轮询算法实例代码

    2023-01-30 03:48:51
  • 谈一谈Android内存泄漏问题

    2023-01-29 23:23:54
  • Java 方法的定义与调用详解

    2023-11-04 13:52:58
  • c#的dllimport使用方法详解

    2023-04-20 04:01:49
  • c# 组合模式

    2022-07-07 09:04:09
  • hibernate-validator如何使用校验框架

    2023-05-25 07:26:29
  • Struts2返回json格式数据代码实例

    2023-10-12 13:15:32
  • android实现横屏的代码及思路

    2023-06-25 09:35:40
  • Springboot-dubbo-fescar 阿里分布式事务的实现方法

    2022-05-05 05:43:16
  • Java利用数组随机抽取幸运观众如何实现

    2022-03-20 11:51:02
  • C#浏览器提示跨域问题解决方案

    2023-08-30 17:37:28
  • asp之家 软件编程 m.aspxhome.com