在项目中碰到了一次用声母码检索信息的功能,在网上找了半天都是根据ArrayAdapter来写的用自定义的适配器很少。
<AutoCompleteTextView
android:id="@+id/actv_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="3dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="3dp"
android:background="@drawable/edittext_select"
android:editable="true"
android:hint="请输入"
android:paddingLeft="10dp"
android:textColor="@color/blue2"
android:textColorHint="@color/grey2"
android:gravity="top"
android:textSize="18sp" >
<requestFocus />
</AutoCompleteTextView>
写一个AutoCompleteTextView
这些属性就不一一介绍了;
在主程序中声明控件;
private AutoCompleteTextView ac_1;
在onCreate方法中初始化;
ac_1=(AutoCompleteTextView) findViewById(R.id.actv_1);
新建一个适配器类;(我用的是内部类)
class PhoneAdapter extends BaseAdapter implements Filterable {
private ArrayFilter mFilter;
private ArrayList<String> mList;
private Context context;
private ArrayList<String> mUnfilteredData;
public PhoneAdapter(ArrayList<String> acList, Context context) {
this.mList = acList;
this.context = context;
}
@Override
public int getCount() {
return mList==null ? 0:mList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
if(convertView==null){
view = View.inflate(context, R.layout.item_info_dict, null);
holder = new ViewHolder();
// holder.tv_input_code = (TextView) view.findViewById(R.id.tv_input_code);
holder.tv_item_name = (TextView) view.findViewById(R.id.tv_item_name);
view.setTag(holder);
}else{
view = convertView;
holder = (ViewHolder) view.getTag();
}
// HashMap<String, String> pc = mList.get(position);
String pc=mList.get(position);
// holder.tv_input_code.setText("code:"+pc.get("input_code"));
// holder.tv_item_name.setText("item_name:"+pc.get("item_name"));
holder.tv_item_name.setText(pc);
return view;
}
class ViewHolder{
public TextView tv_input_code;
public TextView tv_item_name;
}
@Override
public android.widget.Filter getFilter() {
if (mFilter == null) {
mFilter = new ArrayFilter();
}
return mFilter;
}
private class ArrayFilter extends android.widget.Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (mUnfilteredData == null) {
mUnfilteredData = new ArrayList<String> (mList);
}
if (prefix == null || prefix.length() == 0) {
// ArrayList<HashMap<String,String>> list = (ArrayList<HashMap<String, String>>) mUnfilteredData;
ArrayList<String> list = (ArrayList<String>) mUnfilteredData;
results.values = list;
results.count = list.size();
} else {
String prefixString = prefix.toString().toUpperCase();
ArrayList<String> unfilteredValues = mUnfilteredData;
int count = unfilteredValues.size();
// ArrayList<HashMap<String,String>> newValues = new ArrayList<HashMap<String,String>> (count);
ArrayList<String> newValues = new ArrayList<String> (count);
for (int i = 0; i < count; i++) {
// HashMap<String, String> pc = unfilteredValues.get(i);
String pc = unfilteredValues.get(i);
if (pc != null) {
if(pc!=null && pc.startsWith(prefixString)){
// newValues.add(pc);
String [] strings=pc.split("&", -1);
newValues.add(strings[1]);
}/*else if(pc.getEmail()!=null && pc.getEmail().startsWith(prefixString)){
newValues.add(pc);
}*/
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
//noinspection unchecked
mList = (ArrayList<String>) results.values;
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
}
简单说一下我需要的是输入的字符动态的选出所有选项,类似百度输入的功能。但是输入的字符跟选项的字符是不一样的。
我的数据是一个ArrayList中放入的是HashMap
PhoneAdapter mAdapter = new PhoneAdapter(list, this);
ac_1.setAdapter(mAdapter);
ac_1.setThreshold(1); //设置输入一个字符 提示,默认为2
setThreshold(1)这个参数1就是你输入几个字符能提示内容。默认是2个;
给适配器添加一个布局文件这个文件比较简单里边只放了一个TextView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="@color/white"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_item_name"
android:layout_width="wrap_content"
android:singleLine="true"
android:layout_marginLeft="3dp"
android:layout_height="30dp"
android:gravity="center"
android:textSize="16sp"
android:text="item_name" />
</LinearLayout>