AutoCompleteTextView自定义适配器

来源:互联网 发布:三国演义武力排行知乎 编辑:程序博客网 时间:2024/05/22 06:16

在项目中碰到了一次用声母码检索信息的功能,在网上找了半天都是根据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>
0 0