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程序设计有所帮助。

(0)

相关推荐

  • Android 百度地图POI搜索功能实例代码

    在没介绍正文之前先给大家说下poi是什么意思. 由于工作的关系,经常在文件中会看到POI这三个字母的缩写,但是一直对POI的概念和含义没有很详细的去研究其背后代表的意思.今天下班之前,又看到了POI这三个字母,决定认认真真的搜索一些POI具体的含义. POI是英文的缩写,原来的单词是point of interest, 直译成中文就是兴趣点的意思.兴趣点这个词最早来自于导航地图厂商.地图厂商为了提供尽可能多的位置信息,花费了很大的精力去寻找诸如加油站,餐馆,酒店,景点等目的地,这些目的地其实都可

  • Android文本框搜索和清空效果实现代码及简要概述

    前言 本文实现的效果:文本框输入为空时显示输入的图标;不为空时显示清空的图标,此时点击清空图标能清空文本框内输入文字. 正文 一.实现效果 二.实现代码 绑定事件 复制代码 代码如下: private Drawable mIconSearchDefault; // 搜索文本框默认图标 private Drawable mIconSearchClear; // 搜索文本框清除文本内容图标 @Override protected void onCreate(Bundle savedInstanceS

  • Android实现搜索功能并本地保存搜索历史记录

    本文实例为大家分享了Android实现搜索功能,并且需要显示搜索的历史记录,供大家参考,具体内容如下 效果图: 本案例实现起来很简单,所以可以直接拿来嵌入项目中使用,涉及到的知识点: - 数据库的增删改查操作 - ListView和ScrollView的嵌套冲突解决 - 监听软键盘回车按钮设置为搜索按钮 - 使用TextWatcher( )实时筛选 - 已搜索的关键字再次搜索不重复添加到数据库 - 刚进入页面设置软键盘不因为EditText而自动弹出 代码 RecordSQLiteOpenHel

  • Android SearchView搜索框组件的使用方法

    SearchView是搜索框组件,它可以让用户在文本框里输入文字,通过监听器取得用户的输入,当用户点击搜索时,监听器执行实际的搜索. 本文就为大家分享了SearchView搜索框组件的使用方法,供大家参考,具体内容如下 效果: 代码SearchActivity.java package com.jialianjia.bzw.activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.

  • Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡

    一.问题描述 上一次我们使用百度地图实现基本的定位功能,接下来我们继续实现搜索和定位,并使用LocationOverlay绘制定位位置,同时展示如何使用自定义图标绘制并点击时弹出泡泡 如图所示: 二.编写MyApplication类 public class MyApplication extends Application { private static MyApplication mInstance = null; public boolean m_bKeyRight = true; pu

  • Android拨号盘 支持T9搜索和号码搜索等拨号盘案例

    之前做通讯录软件,其中在做拨号盘的时候一直为怎么实现T9输入烦恼,上网找了很多帖子,都没有满意的答案.不过最后终于是实现了,看社区内好像也有不少朋友需要,在此分享一下.这个是在我项目中提取出来的拨号盘案例,功能上完全实现了目前其他通讯录中拨号盘的功能,但在加载效率上还有不足,请各位大侠指教. 有图有真相:     目前我用1g单核cpu的索爱mt15i的测试机,1500多的联系人,加载时间大概在8秒左右,当然,一般用户不会有这么多联系人的.由于我做的程序不是在一开始的界面就是拨号盘,所以我在程序

  • android实现读取、搜索联系人的代码

    代码很简单,就不多废话了 复制代码 代码如下: //读取联系人 public static Uri CONTACTSURI = ContactsContract.Contacts.CONTENT_URI;//联系人     public static void getContactsInfo(Context context,String tag){         String[] projections = new String[]{ContactsContract.Contacts._ID,

  • Android提高之BLE开发Android手机搜索iBeacon基站

    前面文章讲述了Android手机与BLE终端之间的通信,而最常见的BLE终端应该是苹果公司倡导的iBeacon基站.iBeacon技术基于BLE,它的特点是通过广播对外发送消息,手机不需要连上iBeacon基站也能获取它的信息,目前主要用来做室内定位和营销信息推送,在BLE发出的广播里带上带上特定的信息从而被识别为iBeacon.在iOS里面使用iBeacon要经过passbook注册iBeacon的UUID和对应的文字简介,而在Android上则无类似passbook这种系统级的后台蓝牙搜索服

  • Android搜索框组件SearchView的基本使用方法

    SearchView是android系统中内置的一个搜索框组件,可以很方便在添加在用户界面之上,但是也带来了一些问题,那就是searchview的UI是固定的,定制起来会很麻烦,如果对SearchView的要求比较高,完全可以采用button和EditText自己实现.这里先简单的说说SearchView的使用: main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" x

  • Android搜索框通用版

    之前项目总会遇到很多搜索框类的功能,虽然不是很复杂,不过每次都要去自己处理数据,并且去处理搜索框的变化,写起来也比较麻烦,今天来做一个比较简单的通用搜索栏. 先看下效果图: 没什么特别的,只是今天要做的就是简单的把搜索框的内容封装一下. 一.分析功能 先考虑一下,搜索框一般都是由一个搜索图标(一般都是一个放大镜),一个输入框和一个清除按钮组成.然后会通过监听输入框的变化去处理清除按钮的显示和隐藏并且去过滤相关的数据.最后去刷新适配器,显示过滤后的数据.基本上搜索框的功能都大同小异. 有了上边的分

随机推荐