想必大家应该遇到过这样的情况,当点击Spinner控件后弹出的列表内容超多,一个一个滑动着去寻找所要的项很麻烦,尤其是当自己知道想要选择的内容,这时候如果我们只需要输入某些关键字,就可以讲上百条数据筛选出几十条甚至更少,岂不是会方便很多。

其实这是项目中的一个需求,由于目前公司接触的多数和数据采集相关的PDA项目,有很多填写项一个spinner已经不方便满足需求,虽然客户还没有提 出,但提前做好优化总是没有错的,所以项目组的同事提出这个需求并让我尝试着去做出来,当中给了我不少帮助和意见。

闲言少叙,简单说下这个demo的实现,点击一个button,弹出一个类似spinner的界面,包含一个edittext和listview,当在输 入框中键入关键字时,下面的listview所显示的数据可以随之进行筛选,点击item,将所选值返回给button。实现其实不难,只不过接触了一个 新的知识而已,就是TextWatcher,它本身是一个接口,需要实现并覆盖它的三个方法,在每个方法中执行相应的操作,然后在需要的控件上添加监听即 可。先来看本Demo实现后的效果

                                                              

进入后点击按 钮                                                                                                    弹 出数据界面

                                                             

输入关键字进行筛 选                                                                                               点 击子项目返回给按钮

以下是部分代码的实现,其实比较简单,唯一不太熟悉的就是TextWatcher,因为之前没用过,但是很简单,只有三个方法,现实了就OK了

首先介绍一下这个自己写的类,它实现了一个数据的值value和显示名称Name的绑定,可以很方便的用于添加数据,当然也可以使用自己的方法去添加数据,本例子我就用这个了。

  1. package com.cogent.enumbutton;
  2. /**
  3. * 一个Value(绑定值)-Name(显示名称)对象,如:1-汉族
  4. */
  5. public class ValueNameDomain {
  6. private String Value;//绑定的值
  7. private String Name;//显示的选项名称
  8. public ValueNameDomain(){}
  9. public ValueNameDomain(String name,String value){
  10. this.Name = name;
  11. this.Value = value;
  12. }
  13. /**
  14. * 获取绑定的值
  15. */
  16. public String getValue() {
  17. return Value;
  18. }
  19. /**
  20. * 设置绑定的值
  21. */
  22. public void setValue(String value) {
  23. this.Value = value;
  24. }
  25. /**
  26. * 获取显示的选项名称
  27. */
  28. public String getName() {
  29. return Name;
  30. }
  31. /**
  32. * 设置显示的选项名称
  33. */
  34. public void setName(String name) {
  35. this.Name = name;
  36. }
  37. @Override
  38. public String toString() {
  39. return Name;
  40. }
  41. }

这个是demo的关键了,运用一个窗口样式的activity实现类似spinner的功能,具体的地方我都进行了自己能看懂的注解,对输入控件添加addTextChangedListener,并实现其中的三个方法就完成了,三个方法比较简单,为别

也就是文字发生改变之前,改变时,和改变之后进行相应的操作,看看SDK就神马都解决了

  1. package com.cogent.enumbutton;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.text.Editable;
  7. import android.text.TextWatcher;
  8. import android.view.View;
  9. import android.view.Window;
  10. import android.widget.AdapterView;
  11. import android.widget.AdapterView.OnItemClickListener;
  12. import android.widget.Button;
  13. import android.widget.EditText;
  14. import android.widget.ListView;
  15. import android.widget.TextView;
  16. public class EditTextListView extends Activity {
  17. //按钮静态缓存,该用法可以避免使用startActivityForResult来获取按钮返回的时间
  18. public static Button btn;
  19. private EditText edit_search;
  20. private ListView lv;
  21. private EditTextListViewAdapter adapter;
  22. List<ValueNameDomain> list = new ArrayList<ValueNameDomain>();//所有的数据list
  23. List<ValueNameDomain> newlist = new ArrayList<ValueNameDomain>();//查询后的数据list
  24. @Override
  25. protected void onCreate(Bundle savedInstanceState) {
  26. super.onCreate(savedInstanceState);
  27. requestWindowFeature(Window.FEATURE_NO_TITLE);
  28. setContentView(R.layout.edittextlistview);
  29. init();
  30. initDefaultLists();
  31. }
  32. //初始化控件
  33. private void init() {
  34. edit_search = (EditText) findViewById(R.id.edit_search);
  35. //为输入添加TextWatcher监听文字的变化
  36. edit_search.addTextChangedListener(new TextWatcher_Enum());
  37. adapter = new EditTextListViewAdapter(this, list);
  38. lv = (ListView) findViewById(R.id.edittextListview);
  39. lv.setAdapter(adapter);
  40. lv.setOnItemClickListener(new onclick());
  41. }
  42. //添加数据
  43. private void initDefaultLists() {
  44. ValueNameDomain domain = new ValueNameDomain();
  45. for (int i = 1; i <= 20; i++) {
  46. domain = new ValueNameDomain();
  47. domain.setName("测试数据" + i);
  48. domain.setValue(i + "");
  49. list.add(domain);
  50. }
  51. }
  52. //当editetext变化时调用的方法,来判断所输入是否包含在所属数据中
  53. private List<ValueNameDomain> getNewData(String input_info) {
  54. //遍历list
  55. for (int i = 0; i < list.size(); i++) {
  56. ValueNameDomain domain = list.get(i);
  57. //如果遍历到的名字包含所输入字符串
  58. if (domain.getName().contains(input_info)) {
  59. //将遍历到的元素重新组成一个list
  60. ValueNameDomain domain2 = new ValueNameDomain();
  61. domain2.setName(domain.getName());
  62. domain2.setValue(i + "");
  63. newlist.add(domain2);
  64. }
  65. }
  66. return newlist;
  67. }
  68. //button的点击事件
  69. class onclick implements OnItemClickListener {
  70. @Override
  71. public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
  72. TextView text = (TextView) view.findViewById(R.id.tvData);
  73. String str = (String) text.getText();
  74. btn.setText(str);
  75. EditTextListView.this.finish();
  76. }
  77. }
  78. //TextWatcher接口
  79. class TextWatcher_Enum implements TextWatcher {
  80. //文字变化前
  81. @Override
  82. public void beforeTextChanged(CharSequence s, int start, int count,
  83. int after) {
  84. }
  85. //文字变化时
  86. @Override
  87. public void onTextChanged(CharSequence s, int start, int before,
  88. int count) {
  89. newlist.clear();
  90. if (edit_search.getText() != null) {
  91. String input_info = edit_search.getText().toString();
  92. newlist = getNewData(input_info);
  93. adapter = new EditTextListViewAdapter(EditTextListView.this,
  94. newlist);
  95. lv.setAdapter(adapter);
  96. }
  97. }
  98. //文字变化后
  99. @Override
  100. public void afterTextChanged(Editable s) {
  101. }
  102. }
  103. }

这是个比较实用的demo,打算进一步整理出来封装起来,以后项目要是用到的话就可以直接拿来用啦,结尾附上源码,希望大家可以一起学习分享,坚持记录自己的android路程。

来源:http://blog.csdn.net/eyu8874521/article/details/7951691

使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据的更多相关文章

  1. 使用EditText的addTextChangedListener(new TextWatcher())方法

    (转:http://www.apkbus.com/android-5257-1-14.html) 在使用EditText的addTextChangedListener(new TextWatcher( ...

  2. Android - 隐藏EditText弹出的软键盘输入(SoftInput)

    隐藏EditText弹出的软键盘输入(SoftInput) 本文地址: http://blog.csdn.net/caroline_wendy 保持界面的整洁, 能够选择在进入界面时, 隐藏EditT ...

  3. Android一个ListView列表之中插入两种不同的数据

    http://www.cnblogs.com/roucheng/ Android一个ListView列表之中插入两种不同的数据 代码如下: public class ViewHolder{ Butto ...

  4. wpf CollectionViewSource与ListBox的折叠、分组显示,及输入关键字 Filter的筛选

    在wpf中虽然ObservableCollection<T>作为ListBox的Itemsource,很好,很强大!但是CollectionViewSource与ListBox才是天作之合 ...

  5. invalid types 'int[int]' for array subscript// EOF 输入多组数据//如何键盘输入EOF

    数组维度搞错了 一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止 while(scanf("%d %d",&a, &b) != EOF) // 输入结束 ...

  6. 两种方法实现text输入框中“请输入关键字”的提醒

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. C/C++中输入多组数据方法

    --------开始-------- 对于刚开始学编程的人来说每次基本上就是一次数据输入,多次的话基本也是会给定一个数组的大小,但随着做刷算法题开始,题目有的会不直接告诉输入几组数据,基本输入都是多组 ...

  8. Qt移动开发大部分的场景基本上实现没问题,listview支持刷新3000~5000的实时数据没有任何压力(QML的几个大型应用)

    作者:xq zh链接:https://www.zhihu.com/question/29636221/answer/47265577来源:知乎著作权归作者所有,转载请联系作者获得授权. 不知道vs移动 ...

  9. 基于scrapy框架输入关键字爬取有关贴吧帖子

    基于scrapy框架输入关键字爬取有关贴吧帖子 站点分析 首先进入一个贴吧,要想达到输入关键词爬取爬取指定贴吧,必然需要利用搜索引擎 点进看到有四种搜索方式,分别试一次,观察url变化 我们得知: 搜 ...

随机推荐

  1. H5实现的可自定义贪吃蛇游戏

    原创游戏,使用lufylegend.js开发 用canvas实现的贪吃蛇游戏,与一般的贪吃蛇游戏不同,图片经过美工设计,代码设计支持扩展和自定义. 游戏元素丰富,包括障碍物(仙人掌),金币(奖励),苹 ...

  2. XML的约束(schema)

    XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,其出现是为了克服DTD的局限性 XML Schema符合XML语法结构 DOM.SAX等XML API很容易解析出XML Sc ...

  3. 刚刚结束了公司EP流程,开始KMS项目开发了

    刚刚结束了公司EP流程,开始KMS项目开发了 EP流程:AGpoint+MOSS+C# KMS:MOSS上的文档管理系统

  4. 转 asp.net中如何退出整个框架(frameset),回到登录界面

    如: <frameset rows= "74,*,0,0 " cols= "* " frameborder= "NO " border ...

  5. Android Studio 项目代码全部消失--出现原因及解决方法

    出现原因,自己把项目地址父层目录文件名修改了,导致原来打开的项目位置不对,代码全部消失.这样就只要关闭项目,打开一下你修改路径下的项目即可.因为原来的项目还在原来的路径下寻找,但是原来的路径发生了改变

  6. IOS程序开发中-跳转到 发送短信界面 实现发短信

    前言:我发现我标题取的不好,谁帮我取个承接上下文的标题?评论一下,我改 项目需求:在程序开发中,我们需要在某个程序里面发送一些短信验证(不是接收短信验证,关于短信验证,传送门:http://www.c ...

  7. [转载]存储基础:DAS/NAS/SAN存储类型及应用

    这篇文章转自博客教主的一篇博客存储基础:DAS/NAS/SAN存储类型及应用, 他是在张骞的这篇博客DAS,NAS,SAN在数据库存储上的应用上做了部分修改和补充.   一. 硬盘接口类型 1. 并行 ...

  8. Dell PowerVault TL4000 磁带机卡带问题

    最近一段时间Dell PowerVault TL4000 磁带机故障频繁,昨天我在管理系统里面看到Library Status告警:HE: sled blocked, error during sle ...

  9. 软件测试Lab2

    1.本次上机实验任务:使用webDriver完后自动化测试 2.本次上机实验目的:掌握webDriver的用法和配置. 3.本次上机实验内容: 3.1Selenium的安装: 首先我们上Seleniu ...

  10. CSS中vw和vh单位的使用

    vw——viewpoint width,视窗宽度,1vw等于视窗宽度的1%: vh——viewpoint height,视窗高度,1vh等于视窗高度的1%:例子:http://tutorialzine ...