android 输入框自动匹配-AutoCompleteTextView
封装自动适配的adapter可以监听,并且可以监听自动匹配输入框的输入事件。
package com;
import java.util.List;
import android.app.Activity;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
/**
* @ClassName: AutoCompleteTextViewUtil
* @author:hlu
* @Date:2013-4-17
* @version V1.0.0
* @Description: AutoCompleteTextView 实现的自动匹配的实现
*/
public class AutoCompleteTextViewUtil {
private AutoCompleteTextView mACTV ;
private ArrayAdapter<String> mAdapter ;
private ChangeAdapterDataListener mListener ;
private List<String> mListObjects= null ;
private boolean flagMListObjects = false ;
//是否执行查询,当输入框的字符长度大于2时,才会查询,查询了一次之后不会再查询。
private boolean flagQuery = false ;
public AutoCompleteTextViewUtil(AutoCompleteTextView actv){
this.mACTV = actv ;
mACTV.addTextChangedListener(watcher) ;
mACTV.setOnFocusChangeListener(focusListener) ;
mACTV.setOnItemClickListener(itemClickListener) ;
mACTV.setOnClickListener(onClickL) ;
}
public void setAdapter(Activity activity,int resource,List<String> objects){
this.mListObjects = objects ;
flagMListObjects = true ;
flagQuery = false ;
mAdapter = new ArrayAdapter<String>(activity,android.R.layout.simple_dropdown_item_1line, mListObjects);
mACTV.setAdapter(mAdapter) ;
}
public void setAdapter(Activity activity,List<String> objects){
this.setAdapter(activity, android.R.layout.simple_dropdown_item_1line, objects);
}
public void setChangeAdapterDataListener(ChangeAdapterDataListener l){
this.mListener = l ;
}
private void setDataList(String text){
List<String> list = mListener.getDataList(text) ;
if(list != null && list.size() > 0){
mListObjects.addAll(list) ;
}
}
private TextWatcher watcher = new 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) {
String enteredText = s.toString() ;
if(!TextUtils.isEmpty(enteredText) && enteredText.trim().length() > 0){
//查询新匹配值
if(!flagQuery){
if(flagMListObjects){
//更新List的数据。
setDataList(enteredText.trim());
}
mAdapter.notifyDataSetChanged() ;
}
flagQuery = true ;
}else{
flagQuery = false ;
}
}
@Override
public void afterTextChanged(Editable s) {
}
} ;
public interface ChangeAdapterDataListener{
List<String> getDataList(String text) ;
void checkInputTextExist(String text) ;
}
private View.OnFocusChangeListener focusListener = new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
mACTV.setFocusable(hasFocus) ;
if(!hasFocus){
mListener.checkInputTextExist(mACTV.getText().toString().trim()) ;
}
}
};
private OnItemClickListener itemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
mListener.checkInputTextExist(mACTV.getText().toString().trim()) ;
}
};
private OnClickListener onClickL = new OnClickListener() {
@Override
public void onClick(View v) {
mACTV.setFocusableInTouchMode(true) ;
mACTV.requestFocus();
}
};
}
使用方法:
AutoCompleteTextViewUtil actvUtil = new AutoCompleteTextViewUtil(purchaseOrderSite) ;
List<String> data = new ArrayList<String>() ;
actvUtil.setAdapter(this, data) ;
actvUtil.setChangeAdapterDataListener(new ChangeAdapterDataListener() {
@Override
public List<String> getDataList() {
List<String> data = new ArrayList<String>() ;
data.add("qaz");
data.add("qaza");
data.add("qazab");
data.add("qazabd");
return data;
}
});
效果图:
![](https://img-my.csdn.net/uploads/201304/17/1366188681_9353.jpg)
注意:AutoCompleteTextView.setOnItemSelectedListener(), 没有效果