Android编程实现二级下拉菜单及快速搜索的方法
作者:越冬越酷 发布时间:2021-06-17 23:23:07
标签: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程序设计有所帮助。


猜你喜欢
- 一、Kotlin 调用 Java1. kotlin 关键字转义java 中的方法或变量 是 kotlin 的关键字时,使用反引号 `` 对关
- 一、概述之前写了篇Android OkHttp完全解析 是时候来了解OkHttp了,其实主要是作为okhttp的普及文章,当然里面也简单封装
- 1.Java连接redisredis支持哪些语言可以操作 (去redis官网查询)1.1 使用Jedis (1)添加jedis依赖
- 上一篇文章已经介绍了如何为RecyclerView添加FootView,在此基础上,要添加分页加载的功能其实已经很简单了。 上一篇文章地址:
- Java反射动态修改注解的某个属性值昨晚看到一条问题,大意是楼主希望可以动态得建立多个Spring 的定时任务。这个题目我并不是很熟悉,不过
- 《Android开发艺术探索》笔记:在Activity的onCreate()或者onResume()中去获得View的高度的时候不能正确获得
- 本文实例为大家分享了java实现砸金蛋抽奖的具体代码,供大家参考,具体内容如下代码如下需求:用户每一次砸金蛋,抽中一等奖的概率为2% 二等奖
- 解析XML文件:在Android平台上可以使用SAX、DOM和Android附带的pull解析器解析XML文件;pull解析器提供了各种事件
- 本文实例讲述了Java使用synchronized实现互斥锁功能。分享给大家供大家参考,具体如下:代码package per.thread;
- idea去掉不想commit的文件我们项目在每次commit代码时,有时候会有一些不想提交又不能删除的代码,怎么做呢?此方法亲测最方便!!!
- 相信大家都见到了微信图标颜色渐变的过程,是不是感觉很牛逼?不得不说微信团队确实是很厉害的团队,不管是从设计还是开发人员。今天我带大家来看看,
- .NETCORE 中的 Generic Host本文以自己在工作中学习和使用.net core generic-host 作一个总结。前言在
- 在开发中常常使用到刷新分页,这里实现一个 RecyclerView 的简单的刷新分页操作,测试效果见文末,实现过程参考如下:实现思路加载更多
- /// <summary>/// 获取数据缓存/// </summary>/// <param name=&q
- C#中的泛型和反射经常是一起工作的,因此这里就一次性的加以介绍了。由于c#是强类型语言,一般来说函数的返回类型和参数的类型都是一早写好的,这
- 相关api见:点击进入/* * Copyright 2014 the original author or authors. * * Lic
- 近期,Apache SkyWalking 修复了一个隐藏了近4年的Bug - TTL timer 可能失效问题,这个 bug 在 SkyWa
- Pattern类定义public final class Pattern extends Object implementsSerializ
- android系统提供了Environment.getExternalStorageDirectory()接口获得存储器的路径,但是这个接口
- Android中很多产品(比如360手机助手、网易菜单...)都采用侧滑菜单的展现形式,采用这种展现形式1、能把更多的展现内容都存放在菜单中