1.AutoCompleteTextView(自动补全)
首先是自动补全的一个下拉列表
各个属性的含义:
<AutoCompleteTextView
android:id="@+id/auto_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
// 设定几个字母之后开始匹配,忽略大小写的.
android:completionThreshold="1"
android:completionHint="自动补全"
/>
简单的自动提示:中文也支持,但只会根据第一个字母或者汉字去匹配.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<String> list = new ArrayList<>();
list.add("String");
list.add("Integer");
list.add("Float");
list.add("Double");
list.add("Byte");
list.add("Long");
list.add("Boolean");
list.add("Bool");
list.add("北京");
list.add("上海北京");
// 忽略大小写的匹配,adapter必须实现过滤
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
AutoCompleteTextView auto = (AutoCompleteTextView) findViewById(R.id.auto_main);
auto.setAdapter(adapter);
}
效果:
2.中文匹配:(根据中文的拼音去匹配)
中文匹配的过程中,思想在于根据没个城市的拼音首字母来显示对应的城市.不说了,看代码:一个简单的例子
// OnCreate函数中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AutoCompleteTextView auto = (AutoCompleteTextView) findViewById(R.id.mian_auto);
List<Entry> list = new ArrayList<>();
list.add(new Entry("北京", "beijing"));
list.add(new Entry("上海", "shanghai"));
list.add(new Entry("天津", "tianjin"));
list.add(new Entry("重庆", "chongqing"));
list.add(new Entry("河北", "hebei"));
list.add(new Entry("河南", "henan"));
list.add(new Entry("山东", "shandong"));
AutoAdapter adapter = new AutoAdapter(this, list);
auto.setAdapter(adapter);
}
布局和自动补全的布局一样
// adapter端:
package com.xiaohong.auto_myself.adapter;
import android.content.Context;
import android.text.TextUtils;
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 com.xiaohong.auto_myself.entry.Entry;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class AutoAdapter extends BaseAdapter implements Filterable {
private Context context;
private List<Entry> list;
private List<Entry> backup;
private Filter filter;
public AutoAdapter(Context context, List<Entry> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = new TextView(context);
}
((TextView) convertView).setText(list.get(position).getText());
return convertView;
}
// 定义一个过滤器,只要是Adapter,都会有过滤器的,有的是适配器自己实现,特殊功能需要自己手写.
// 过滤器,就是根据你想啥,他就给你过滤啥.哈哈
// 比如,一袋子零钱,但是你只想要面值最大的的,过滤器就会找出面值最大的钞票啊...
@Override
public Filter getFilter() {
if (filter == null) {
filter = new AutoFilter();
}
return filter;
}
public class AutoFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (backup == null) {
backup = new ArrayList<>(list);
}
FilterResults results = new FilterResults();
if (!TextUtils.isEmpty(constraint)) {
ArrayList<Entry> entries = new ArrayList<>();
for (Entry entry : backup) {
if (entry.getPinyin().startsWith(constraint.toString())) {
entries.add(entry);
}
}
results.count = entries.size();
results.values = entries;
} else {
results.count = 0;
results.values = new ArrayList<>();
}
return results;
}
// 结果返回
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
list.clear();
list.addAll(((Collection<? extends Entry>) results.values));
notifyDataSetChanged();
}
}
}
效果:
目前,我们可以采用第三方的库去实现补全,很方便的哟……
3.MultiAutoCompleteTextView
多补全:用处,在短信发送个所个小朋友的时候,就用到啦.
和第二个例子相比不用改太多:
List<Entry> list1 = new ArrayList<>();
list1.add(new Entry("北京","beijing"));
list1.add(new Entry("上海","shanghai"));
list1.add(new Entry("天津","tianjin"));
list1.add(new Entry("重庆","chongqing"));
list1.add(new Entry("河北","hebei"));
list1.add(new Entry("河南","henan"));
list1.add(new Entry("山东","shandong"));
// 多补全
AutoAdapter autoAdapter = new AutoAdapter(this, list1);
MultiAutoCompleteTextView multi = (MultiAutoCompleteTextView) findViewById(R.id.muti_main_auto);
multi.setAdapter(adapter);
MultiAutoCompleteTextView.CommaTokenizer tokenizer = new MultiAutoCompleteTextView.CommaTokenizer();
tokenizer.terminateToken(",");