AutoCompleteTextView 下拉列表 可编辑 逐渐提示
package com.river.searchEdit;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AutoCompleteTextView;
import android.widget.LinearLayout;
import com.river.searchEdit.util.SearchAdapter;
public class MainActivity extends Activity implements View.OnFocusChangeListener {
private AutoCompleteTextView search;
private String[] str = {"上海", "香港", "深圳", "武汉", "新加坡"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
search = (AutoCompleteTextView) findViewById(R.id.search);
SearchAdapter<String> adapter = new SearchAdapter<String>(MainActivity.this, str);
search.setAdapter(adapter);
search.setOnFocusChangeListener(MainActivity.this);
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
AutoCompleteTextView view = (AutoCompleteTextView) v;
if (hasFocus) {
view.showDropDown();
}
}
}
package com.river.searchEdit.util;
import android.content.Context;
import android.util.Log;
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.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class SearchAdapter<T> extends BaseAdapter implements Filterable {
private List<T> mObjects;
private List<Set<String>> pinyinList;
private ArrayList<T> mOriginalValues;
private ArrayFilter mFilter;
private LayoutInflater mInflater;
public SearchAdapter(Context context, T[] objects) {
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mObjects = Arrays.asList(objects);
this.pinyinList = getHanziSpellList(objects);
}
private List<Set<String>> getHanziSpellList(T[] hanzi) {
List<Set<String>> listSet = new ArrayList<Set<String>>();
PinYin4j pinyin = new PinYin4j();
for (int i = 0; i < hanzi.length; i++) {
listSet.add(pinyin.getPinyin(hanzi[i].toString()));
}
return listSet;
}
public int getCount() {
return mObjects.size();
}
public T getItem(int position) {
return mObjects.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
return createViewFromResource(position, convertView, parent, android.R.layout.simple_list_item_1);
}
private View createViewFromResource(int position, View convertView, ViewGroup parent, int resource) {
View view;
TextView text;
if (convertView == null) {
view = mInflater.inflate(resource, parent, false);
} else {
view = convertView;
}
text = (TextView) view;
text.setText(getItem(position).toString());
return view;
}
public Filter getFilter() {
if (mFilter == null) {
mFilter = new ArrayFilter();
}
return mFilter;
}
private class ArrayFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (mOriginalValues == null) {
mOriginalValues = new ArrayList<T>(mObjects);
}
if (prefix == null || prefix.length() == 0) {
ArrayList<T> list = new ArrayList<T>(mOriginalValues);
results.values = list;
results.count = list.size();
} else {
String prefixString = prefix.toString().toLowerCase();
final ArrayList<T> hanzi = mOriginalValues; // 汉字String
final Set<T> newValues = new HashSet<T>(hanzi.size()); // 支持多音字,不重复
for (int i = 0; i < hanzi.size(); i++) {
final T value = hanzi.get(i); // 汉字String
final String valueText = value.toString().toLowerCase(); // 汉字String
final Set<String> pinyinSet = pinyinList.get(i);
Iterator iterator = pinyinSet.iterator();
while (iterator.hasNext()) {
final String pinyin = iterator.next().toString().toLowerCase(); // 取出多音字里的一个字母
if (pinyin.indexOf(prefixString) != -1) {
newValues.add(value);
} else if (valueText.indexOf(prefixString) != -1) { // 如果是汉字则直接添加
newValues.add(value);
}
}
}
List<T> list = Set2List(newValues);
results.values = list;
results.count = list.size();
}
return results;
}
@SuppressWarnings("unchecked")
protected void publishResults(CharSequence constraint, FilterResults results) {
mObjects = (List<T>) results.values;
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
@SuppressWarnings("hiding")
public <T extends Object> List<T> Set2List(Set<T> oSet) {
List<T> tList = new ArrayList<T>(oSet);
return tList;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical">
<AutoCompleteTextView
android:id="@+id/search"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_margin="100dp"
android:background="@color/colorPrimary"
android:completionThreshold="1"
android:dropDownWidth="180dp"
android:dropDownHeight="200dp"
android:hint="输入名称或拼音首字母"
android:imeOptions="actionSearch"
android:maxLength="12"
android:singleLine="true"
android:textColor="#317F6D"
android:textColorHint="#317F6D"
android:textCursorDrawable="@drawable/edittext_cursor"
android:textSize="15sp" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.river.searchEdit">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name="com.river.searchEdit.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>