AutoCompleteTextView自定义适配器

在项目中碰到了一次用声母码检索信息的功能,在网上找了半天都是根据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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值