使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
想必大家应该遇到过这样的情况,当点击Spinner控件后弹出的列表内容超多,一个一个滑动着去寻找所要的项很麻烦,尤其是当自己知道想要选择的内容,这时候如果我们只需要输入某些关键字,就可以讲上百条数据筛选出几十条甚至更少,岂不是会方便很多。
其实这是项目中的一个需求,由于目前公司接触的多数和数据采集相关的PDA项目,有很多填写项一个spinner已经不方便满足需求,虽然客户还没有提 出,但提前做好优化总是没有错的,所以项目组的同事提出这个需求并让我尝试着去做出来,当中给了我不少帮助和意见。
闲言少叙,简单说下这个demo的实现,点击一个button,弹出一个类似spinner的界面,包含一个edittext和listview,当在输 入框中键入关键字时,下面的listview所显示的数据可以随之进行筛选,点击item,将所选值返回给button。实现其实不难,只不过接触了一个 新的知识而已,就是TextWatcher,它本身是一个接口,需要实现并覆盖它的三个方法,在每个方法中执行相应的操作,然后在需要的控件上添加监听即 可。先来看本Demo实现后的效果

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

输入关键字进行筛 选 点 击子项目返回给按钮
以下是部分代码的实现,其实比较简单,唯一不太熟悉的就是TextWatcher,因为之前没用过,但是很简单,只有三个方法,现实了就OK了
首先介绍一下这个自己写的类,它实现了一个数据的值value和显示名称Name的绑定,可以很方便的用于添加数据,当然也可以使用自己的方法去添加数据,本例子我就用这个了。
- package com.cogent.enumbutton;
- /**
- * 一个Value(绑定值)-Name(显示名称)对象,如:1-汉族
- */
- public class ValueNameDomain {
- private String Value;//绑定的值
- private String Name;//显示的选项名称
- public ValueNameDomain(){}
- public ValueNameDomain(String name,String value){
- this.Name = name;
- this.Value = value;
- }
- /**
- * 获取绑定的值
- */
- public String getValue() {
- return Value;
- }
- /**
- * 设置绑定的值
- */
- public void setValue(String value) {
- this.Value = value;
- }
- /**
- * 获取显示的选项名称
- */
- public String getName() {
- return Name;
- }
- /**
- * 设置显示的选项名称
- */
- public void setName(String name) {
- this.Name = name;
- }
- @Override
- public String toString() {
- return Name;
- }
- }
这个是demo的关键了,运用一个窗口样式的activity实现类似spinner的功能,具体的地方我都进行了自己能看懂的注解,对输入控件添加addTextChangedListener,并实现其中的三个方法就完成了,三个方法比较简单,为别
也就是文字发生改变之前,改变时,和改变之后进行相应的操作,看看SDK就神马都解决了
- package com.cogent.enumbutton;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.Activity;
- import android.os.Bundle;
- import android.text.Editable;
- import android.text.TextWatcher;
- import android.view.View;
- import android.view.Window;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.ListView;
- import android.widget.TextView;
- public class EditTextListView extends Activity {
- //按钮静态缓存,该用法可以避免使用startActivityForResult来获取按钮返回的时间
- public static Button btn;
- private EditText edit_search;
- private ListView lv;
- private EditTextListViewAdapter adapter;
- List<ValueNameDomain> list = new ArrayList<ValueNameDomain>();//所有的数据list
- List<ValueNameDomain> newlist = new ArrayList<ValueNameDomain>();//查询后的数据list
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.edittextlistview);
- init();
- initDefaultLists();
- }
- //初始化控件
- private void init() {
- edit_search = (EditText) findViewById(R.id.edit_search);
- //为输入添加TextWatcher监听文字的变化
- edit_search.addTextChangedListener(new TextWatcher_Enum());
- adapter = new EditTextListViewAdapter(this, list);
- lv = (ListView) findViewById(R.id.edittextListview);
- lv.setAdapter(adapter);
- lv.setOnItemClickListener(new onclick());
- }
- //添加数据
- private void initDefaultLists() {
- ValueNameDomain domain = new ValueNameDomain();
- for (int i = 1; i <= 20; i++) {
- domain = new ValueNameDomain();
- domain.setName("测试数据" + i);
- domain.setValue(i + "");
- list.add(domain);
- }
- }
- //当editetext变化时调用的方法,来判断所输入是否包含在所属数据中
- private List<ValueNameDomain> getNewData(String input_info) {
- //遍历list
- for (int i = 0; i < list.size(); i++) {
- ValueNameDomain domain = list.get(i);
- //如果遍历到的名字包含所输入字符串
- if (domain.getName().contains(input_info)) {
- //将遍历到的元素重新组成一个list
- ValueNameDomain domain2 = new ValueNameDomain();
- domain2.setName(domain.getName());
- domain2.setValue(i + "");
- newlist.add(domain2);
- }
- }
- return newlist;
- }
- //button的点击事件
- class onclick implements OnItemClickListener {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
- TextView text = (TextView) view.findViewById(R.id.tvData);
- String str = (String) text.getText();
- btn.setText(str);
- EditTextListView.this.finish();
- }
- }
- //TextWatcher接口
- class TextWatcher_Enum implements 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) {
- newlist.clear();
- if (edit_search.getText() != null) {
- String input_info = edit_search.getText().toString();
- newlist = getNewData(input_info);
- adapter = new EditTextListViewAdapter(EditTextListView.this,
- newlist);
- lv.setAdapter(adapter);
- }
- }
- //文字变化后
- @Override
- public void afterTextChanged(Editable s) {
- }
- }
- }
这是个比较实用的demo,打算进一步整理出来封装起来,以后项目要是用到的话就可以直接拿来用啦,结尾附上源码,希望大家可以一起学习分享,坚持记录自己的android路程。
来源:http://blog.csdn.net/eyu8874521/article/details/7951691
使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据的更多相关文章
- 使用EditText的addTextChangedListener(new TextWatcher())方法
(转:http://www.apkbus.com/android-5257-1-14.html) 在使用EditText的addTextChangedListener(new TextWatcher( ...
- Android - 隐藏EditText弹出的软键盘输入(SoftInput)
隐藏EditText弹出的软键盘输入(SoftInput) 本文地址: http://blog.csdn.net/caroline_wendy 保持界面的整洁, 能够选择在进入界面时, 隐藏EditT ...
- Android一个ListView列表之中插入两种不同的数据
http://www.cnblogs.com/roucheng/ Android一个ListView列表之中插入两种不同的数据 代码如下: public class ViewHolder{ Butto ...
- wpf CollectionViewSource与ListBox的折叠、分组显示,及输入关键字 Filter的筛选
在wpf中虽然ObservableCollection<T>作为ListBox的Itemsource,很好,很强大!但是CollectionViewSource与ListBox才是天作之合 ...
- invalid types 'int[int]' for array subscript// EOF 输入多组数据//如何键盘输入EOF
数组维度搞错了 一次运行,要输入多组数据,直到读至输入文件末尾(EOF)为止 while(scanf("%d %d",&a, &b) != EOF) // 输入结束 ...
- 两种方法实现text输入框中“请输入关键字”的提醒
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C/C++中输入多组数据方法
--------开始-------- 对于刚开始学编程的人来说每次基本上就是一次数据输入,多次的话基本也是会给定一个数组的大小,但随着做刷算法题开始,题目有的会不直接告诉输入几组数据,基本输入都是多组 ...
- Qt移动开发大部分的场景基本上实现没问题,listview支持刷新3000~5000的实时数据没有任何压力(QML的几个大型应用)
作者:xq zh链接:https://www.zhihu.com/question/29636221/answer/47265577来源:知乎著作权归作者所有,转载请联系作者获得授权. 不知道vs移动 ...
- 基于scrapy框架输入关键字爬取有关贴吧帖子
基于scrapy框架输入关键字爬取有关贴吧帖子 站点分析 首先进入一个贴吧,要想达到输入关键词爬取爬取指定贴吧,必然需要利用搜索引擎 点进看到有四种搜索方式,分别试一次,观察url变化 我们得知: 搜 ...
随机推荐
- [WCF REST] Web消息主体风格(Message Body Style)
对于Web HTTP编程模型来说,服务契约中作为操作的方法无须应用OperationContractAttribute特性,只需要根据需要应用WebGetAttribute与WebInvokeAttr ...
- HTML 5 <mark> 标签
一,定义和用法 <mark> 标签定义带有记号的文本.请在需要突出显示文本时使用 <m> 标签. 二,实例 突出显示部分文本: <!DOCTYPE HTML> &l ...
- MySQL数据库中字符集的问题
今天在做Hibernate案例,往mysql中写记录的时候,出现ERROR: Incorrect string value: '\xE5\x8A\xA0\xE5\x86\x85...' for col ...
- adb 的相关操作及遇到的问题
一. 电脑连接你的手机 1.打开手机的开发者模式 并 开启调试工具 2.用手机连接上 你的电脑 3.在eclipse 中的DDMS 中查看是否 连接到 如图所示: 这时会发现 多了一个连接 :说明 ...
- UWP开发-重新理解MVVM
MVVM是一个比较热门的开发框架,尽管已经出现很久了,仍然比较受欢迎.MVVM框架包括: M:Model:Model指的是数据模型,例如你要在页面展示联系人信息,那么Model就是联系人的模型,包括联 ...
- DKNightVersion 的实现 --- 如何为 iOS 应用添加夜间模式
在很多重阅读或者需要在夜间观看的软件其实都会把夜间模式当做一个 App 所需要具备的特性. 而如何在不改变原有的架构, 甚至不改变原有的代码的基础上, 就能为应用优雅地添加夜间模式就成为一个在很多应用 ...
- DP大作战——多重背包
题目描述 在之前的上机中,零崎已经出过了01背包和完全背包,也介绍了使用-1初始化容量限定背包必须装满这种小技巧,接下来的背包问题相对有些难度,可以说是01背包和完全背包的进阶问题. 多重背包:物品可 ...
- SAM4E单片机之旅——22、GMAC和PHY的介绍与初始化
网络通信的作用不用多说,而这次进行的工作即是对以太网通信过程中,需要用到的硬件部分进行初始化,也介绍了发送和接收数据的方法. 由于较为复杂,所以使用了ASF框架.但是也会对用到的库函数的实现做一个介绍 ...
- 【Other】U盘FAT32转NTFS且无数据丢失
序: 做了一个U盘启动盘后发现文件系统格式为FAT32.这种格式支持单个文件最大4G,超过4G就无法拷贝了.为了防止以后突发情况所以提前把FAT32转换成NTFS.为避免导入导出数据最简单的方法利用D ...
- 使用MongoDB C#官方驱动操作MongoDB
想要在C#中使用MongoDB,首先得要有个MongoDB支持的C#版的驱动.C#版的驱动有很多种,如官方提供的,samus. 实现思路大都类似.这里我们先用官方提供的mongo-csharp-dri ...