其實這是項目中的一個需求,因爲目前公司接觸的多數和數據採集相關的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路程 測試