其实这是项目中的一个需求,因为目前公司接触的多数和数据采集相关的PDA项目,有不少填写项一个spinner已经不方便知足需求,虽然客户尚未提出,但提早作好优化老是没有错的,因此项目组的同事提出这个需求并让我尝试着去作出来,当中给了我很多帮助和意见。 html
闲言少叙,简单说下这个demo的实现,点击一个button,弹出一个相似spinner的界面,包含一个edittext和listview,当在输入框中键入关键字时,下面的listview所显示的数据能够随之进行筛选,点击item,将所选值返回给button。实现其实不难,只不过接触了一个新的知识而已,就是TextWatcher,它自己是一个接口,须要实现并覆盖它的三个方法,在每一个方法中执行相应的操做,而后在须要的控件上添加监听便可。先来看本Demo实现后的效果 java
进入后点击按钮 弹出数据界面 android
输入关键字进行筛选 点击子项目返回给按钮 缓存
如下是部分代码的实现,其实比较简单,惟一不太熟悉的就是TextWatcher,由于以前没用过,可是很简单,只有三个方法,现实了就OK了 app
首先介绍一下这个本身写的类,它实现了一个数据的值value和显示名称Name的绑定,能够很方便的用于添加数据,固然也可使用本身的方法去添加数据,本例子我就用这个了。 dom
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,并实现其中的三个方法就完成了,三个方法比较简单,为别 ide
也就是文字发生改变以前,改变时,和改变以后进行相应的操做,看看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路程 测试