展会信息港展会大全

使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据
来源:互联网   发布日期:2016-01-06 19:11:11   浏览:1716次  

导读:使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据想必大家应该遇到过这样的情况,当点击Spinner控件后弹出的列表内容超多,一个一个滑动着去寻找所要的项很麻烦,尤其是当自己知道想要选择的内容,......

使用EditText+ListView并结合TextWatcher实现输入关键字筛选数据

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

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

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

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

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

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

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

[java] view plain copy print ?

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;

}

}

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就神马都解决了

[html] view plain copy print ?

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 list = new ArrayList();//所有的数据list

List newlist = new ArrayList();//查询后的数据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 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(AdapterViewparent, 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) {

}

}

}

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 list = new ArrayList();//所有的数据list

List newlist = new ArrayList();//查询后的数据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 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(AdapterViewparent, 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路程

赞助本站

人工智能实验室

相关热词: 输入关键字 筛选

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港