您的位置:首页 > 移动开发 > Android开发

android 输入框自动匹配-AutoCompleteTextView

2013-04-17 16:46 417 查看

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;
}
});
效果图:



注意:AutoCompleteTextView.setOnItemSelectedListener(), 没有效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: