生活随笔
收集整理的這篇文章主要介紹了
TextWatcher实现输入关键字筛选数据
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
想必大家應(yīng)該遇到過這樣的情況,當點擊Spinner控件后彈出的列表內(nèi)容超多,一個一個滑動著去尋找所要的項很麻煩,尤其是當自己知道想要選擇的內(nèi)容,這時候如果我們只需要輸入某些關(guān)鍵字,就可以講上百條數(shù)據(jù)篩選出幾十條甚至更少,豈不是會方便很多。
??? 其實這是項目中的一個需求,由于目前公司接觸的多數(shù)和數(shù)據(jù)采集相關(guān)的PDA項目,有很多填寫項一個spinner已經(jīng)不方便滿足需求,雖然客戶還沒有提出,但提前做好優(yōu)化總是沒有錯的,所以項目組的同事提出這個需求并讓我嘗試著去做出來,當中給了我不少幫助和意見。
??? 閑言少敘,簡單說下這個demo的實現(xiàn),點擊一個button,彈出一個類似spinner的界面,包含一個edittext和listview,當在輸入框中鍵入關(guān)鍵字時,下面的listview所顯示的數(shù)據(jù)可以隨之進行篩選,點擊item,將所選值返回給button。實現(xiàn)其實不難,只不過接觸了一個新的知識而已,就是TextWatcher,它本身是一個接口,需要實現(xiàn)并覆蓋它的三個方法,在每個方法中執(zhí)行相應(yīng)的操作,然后在需要的控件上添加監(jiān)聽即可。先來看本Demo實現(xiàn)后的效果
?
首先介紹一下這個自己寫的類,它實現(xiàn)了一個數(shù)據(jù)的值value和顯示名稱Name的綁定,可以很方便的用于添加數(shù)據(jù),當然也可以使用自己的方法去添加數(shù)據(jù),本例子我就用這個了。
package?com.cogent.enumbutton;?? ?? ? ? ?? 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的關(guān)鍵了,運用一個窗口樣式的activity實現(xiàn)類似spinner的功能,具體的地方我都進行了自己能看懂的注解,對輸入控件添加addTextChangedListener,并實現(xiàn)其中的三個方法就完成了,三個方法比較簡單,為別
也就是文字發(fā)生改變之前,改變時,和改變之后進行相應(yīng)的操作,看看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?{?? ????//按鈕靜態(tài)緩存,該用法可以避免使用startActivityForResult來獲取按鈕返回的時間?? ????public?static?Button?btn;?? ????private?EditText?edit_search;?? ????private?ListView?lv;?? ????private?EditTextListViewAdapter?adapter;?? ????List<ValueNameDomain>?list?=?new?ArrayList<ValueNameDomain>();//所有的數(shù)據(jù)list?? ????List<ValueNameDomain>?newlist?=?new?ArrayList<ValueNameDomain>();//查詢后的數(shù)據(jù)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監(jiān)聽文字的變化?? ????????edit_search.addTextChangedListener(new?TextWatcher_Enum());?? ????????adapter?=?new?EditTextListViewAdapter(this,?list);?? ????????lv?=?(ListView)?findViewById(R.id.edittextListview);?? ????????lv.setAdapter(adapter);?? ????????lv.setOnItemClickListener(new?onclick());?? ????}?? ?? ????//添加數(shù)據(jù)?? ????private?void?initDefaultLists()?{?? ????????ValueNameDomain?domain?=?new?ValueNameDomain();?? ????????for?(int?i?=?1;?i?<=?20;?i++)?{?? ????????????domain?=?new?ValueNameDomain();?? ????????????domain.setName("測試數(shù)據(jù)"?+?i);?? ????????????domain.setValue(i?+?"");?? ????????????list.add(domain);?? ????????}?? ?? ????}?? ?? ????//當editetext變化時調(diào)用的方法,來判斷所輸入是否包含在所屬數(shù)據(jù)中?? ????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)?{?? ?? ????????}?? ?? ????}?? ?? } ?
出處:http://www.cnblogs.com/eyu8874521/archive/2012/09/07/2674551.html
總結(jié)
以上是生活随笔為你收集整理的TextWatcher实现输入关键字筛选数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。