1. 自定义匹配
具体代码如下
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MyAdapter<T> extends BaseAdapter implements Filterable
{
private List<T> mOriginalValues;
private List<T> mObject;
private final Object mLock = new Object();
private int mResouce;
private MyFilter myFilter = null;
private LayoutInflater inflater;
public MyAdapter(Context context, int TextViewResouceId, List<T> objects)
{
init(context,TextViewResouceId,objects);
}
private void init(Context context, int textViewResouceId, List<T> objects)
{
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mObject = objects;
mResouce = textViewResouceId;
myFilter = new MyFilter();
}
@Override
public int getCount() {
return mObject.size();
}
@Override
public T getItem(int position) {
return mObject.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getViewFromResouce(position,convertView,parent,mResouce);
}
private View getViewFromResouce(int position, View convertView,
ViewGroup parent, int mResouce2) {
if(convertView == null)
{
convertView = inflater.inflate(mResouce2, parent,false);
}
TextView tv = (TextView)convertView;
T item = getItem(position);
if(item instanceof CharSequence)
{
tv.setText((CharSequence)item);
}
else
{
tv.setText(item.toString());
}
return tv;
}
//返回过滤器
@Override
public Filter getFilter() {
return myFilter;
}
//自定义过滤器
private class MyFilter extends Filter
{
//得到过滤结果
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(mOriginalValues == null)
{
synchronized (mLock) {
mOriginalValues = new ArrayList<T>(mObject);
}
}
int count = mOriginalValues.size();
ArrayList<T> values = new ArrayList<T>();
for(int i = 0;i < count;i++)
{
T value = mOriginalValues.get(i);
String valueText = value.toString();
//自定义匹配规则
if(valueText != null && (constraint == null || valueText.contains(constraint.toString().trim())))
{
values.add(value);
}
}
results.values = values;
results.count = values.size();
return results;
}
//发布过滤结果
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
//把搜索结果赋值给mObject这样每次输入字符串的时候就不必
//从所有的字符串中查找,从而提高了效率
mObject = (List<T>)results.values;
if(results.count > 0)
{
notifyDataSetChanged();
}
else
{
notifyDataSetInvalidated();
}
}
}
}
2. 为空显示全部
需要考虑监听的事件
- 聚焦发生变化
- 点击事件
- 已经有文字,然后删除文字,
JAVA代码如下
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
public class SwAutoCompleteTextView extends androidx.appcompat.widget.AppCompatAutoCompleteTextView {
public SwAutoCompleteTextView(Context context) {
super(context);
}
public SwAutoCompleteTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SwAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean enoughToFilter() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
if (focused && getAdapter() != null) {
performFiltering(getText(), 0);
}
}
@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
if (text.length() == 0) {
text = " ";
}
super.onTextChanged(text, start, lengthBefore, lengthAfter);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
this.showDropDown();
return super.onTouchEvent(event);
}
}
XML代码
<com.example.testauto.SwAutoCompleteTextView
android:id="@+id/autotext"
android:hint="请输入关键字"
android:completionThreshold="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>