layout.xml布局文件
<AutoCompleteTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:completionThreshold="1"//<span style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; background-color: rgb(248, 236, 216);">android:completionThreshold定义了从第几个字符开始显示候补列表</span><span style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; background-color: rgb(248, 236, 216);">默认值为2</span>
android:id="@+id/main_auto"/>
<MultiAutoCompleteTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/main_auto"
android:completionThreshold="1"
android:id="@+id/main_multi"/>
Entry.java
public class Entry {
private String text;
private String pinyin;
public Entry(String text, String pinyin) {
this.text = text;
this.pinyin = pinyin;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getPinyin() {
return pinyin;
}
public void setPinyin(String pinyin) {
this.pinyin = pinyin;
}
@Override
public String toString() {
return text ;
}
}
AutoAdapter.java
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;
}
@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);
}
// if (constraint != null && constraint.length() > 0) {
//
// }
/*
*!TextUtils.isEmpty(constraint)等同于 if (constraint != null && constraint.length() > 0)
*
* */
FilterResults results = new FilterResults();
if (!TextUtils.isEmpty(constraint)) {
List<Entry> entries = new ArrayList<>();
for (Entry entry : backup) {
String pinyin = entry.getPinyin();
if (pinyin.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();
}
}
}
PinyinAdapter.java
public class PinyinAdapter extends BaseAdapter implements Filterable{
private Context context;
private List<String> list;
private List<String> backup;
private Filter filter;
public PinyinAdapter(Context context, List<String> 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));
return convertView;
}
@Override
public Filter getFilter() {
if (filter == null) {
filter = new PinyinFilter();
}
return filter;
}
public class PinyinFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (backup == null) {
backup = new ArrayList<>(list);
}
FilterResults results = new FilterResults();
if (!TextUtils.isEmpty(constraint)) {
List<String> strings = new ArrayList<>();
for (String s : backup) {
try {
String pinyin = PinyinHelper.convertToPinyinString(s, "", PinyinFormat.WITHOUT_TONE);
if (pinyin.contains(constraint)) {
strings.add(s);
} else {
String shortPinyin = PinyinHelper.getShortPinyin(s);
if (shortPinyin.startsWith(constraint.toString())) {
strings.add(s);
}
}
} catch (PinyinException e) {
e.printStackTrace();
}
}
results.count = strings.size();
results.values = strings;
}else {
results.count = 0;
results.values = new ArrayList<>();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
list.clear();
list.addAll((Collection<? extends String>) results.values);
notifyDataSetChanged();
}
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); List<String> list1 = new ArrayList<>(); list1.add("北京"); list1.add("上海"); list1.add("天京"); list1.add("深圳"); list1.add("河北"); list1.add("河南"); list1.add("山东"); list1.add("山西"); // ArrayAdapter<String> adapter1 = new ArrayAdapter<> // (this,android.R.layout.simple_list_item_1,list1); PinyinAdapter adapter1 = new PinyinAdapter(this, list1); 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("山东","shangdong")); AutoAdapter autoAdapter = new AutoAdapter(this, list); AutoCompleteTextView auto = (AutoCompleteTextView) findViewById(R.id.main_auto); auto.setAdapter(autoAdapter); MultiAutoCompleteTextView multi = (MultiAutoCompleteTextView) findViewById(R.id.main_multi); multi.setAdapter(adapter1); MultiAutoCompleteTextView.CommaTokenizer tokenizer = new MultiAutoCompleteTextView.CommaTokenizer(); tokenizer.terminateToken(","); multi.setTokenizer(tokenizer); } }