Android输入框实时模糊搜索

Android输入框实时模糊搜索

很多开发场景会用到搜索框实时模糊搜索来帮助用户输入内容,如图

模糊搜索效果

思路是在EditText 字符变动的时候 弹出ListPopupwindow并更新列表,这样的做法google已经封装为AutoCompleteTextView

用法

        mAutoCompleteTextView.setAdapter(adapter);
        mAutoCompleteTextView.setFocusable(true);
        mAutoCompleteTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            
            }
        });

adapter自定义
Adapter 继承 BaseApdater 需要实现 Filterable 接口

private class SearchAdapter extends BaseAdapter implements Filterable {

        private Context mContext;

        public SearchAdapter(Context context) {
            super();
            this.mContext = context;
        }

        @Override
        public int getCount() {
            if (mSearchCustomEntities == null) {
                return 0;
            } else {
                return mSearchCustomEntities.size();
            }
        }

        @Override
        public Object getItem(int position) {
            if (mSearchCustomEntities == null) {
                return null;
            } else {
                return mSearchCustomEntities.get(position);
            }

        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = LayoutInflater.from(mContext).inflate(R.layout.item_search_custom, null, false);
                holder.tag = (TextView) convertView.findViewById(R.id.tv_custome_type);
                holder.name = (TextView) convertView.findViewById(R.id.custom_name);
                holder.phone = (TextView) convertView.findViewById(R.id.tv_phone);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.phone.setText(mSearchCustomEntities.get(position).phone);
            holder.name.setText(mSearchCustomEntities.get(position).name);
            if (mSearchCustomEntities.get(position).type == CustomerType.TEMPORARY_CUSTOMER.getType()) {
                holder.tag.setVisibility(View.VISIBLE);
                holder.tag.setText(mContext.getString(R.string.tag_temp));
                holder.tag.setTextColor(mContext.getResources().getColor(R.color.customer_temp_txt));
                holder.tag.setBackground(mContext.getResources().getDrawable(R.drawable.bg_solid_quote_type_inner_temp));
            } else if (mSearchCustomEntities.get(position).type == CustomerType.COLLECTIVE_UNIT.getType()) {
                holder.tag.setVisibility(View.VISIBLE);
                holder.tag.setText(mContext.getString(R.string.tag_unit));
                holder.tag.setTextColor(mContext.getResources().getColor(R.color.customer_unit_txt));
                holder.tag.setBackground(mContext.getResources().getDrawable(R.drawable.bg_solid_quote_type_inner_unit));
            } else if (mSearchCustomEntities.get(position).type == CustomerType.OUTER_MOTORCADE.getType()) {
                holder.tag.setVisibility(View.VISIBLE);
                holder.tag.setText(mContext.getString(R.string.tag_car));
                holder.tag.setTextColor(mContext.getResources().getColor(R.color.customer_car_txt));
                holder.tag.setBackground(mContext.getResources().getDrawable(R.drawable.bg_solid_quote_type_inner_car));
            } else {
                holder.tag.setVisibility(View.GONE);
            }

            return convertView;
        }

        @Override
        public Filter getFilter() {
            if (mFilter == null) {
                mFilter = new ArrayFilter();
            }
            return mFilter;
        }
          private class ViewHolder {
            TextView tag;
            TextView name;
            TextView phone;
        }

自定义 过滤器

  private class ArrayFilter extends Filter {

            @Override
            protected FilterResults performFiltering(CharSequence prefix) {
                FilterResults results = new FilterResults();
                String prefixString = prefix.toString();


                //筛选部分  访问接口
  
                XbcClient.getCustomList(prefixString, new EntitiesObserver<SearchCustomEntity>() {
                    @Override
                    protected void onGot(List<SearchCustomEntity> entities, String msg, int errCode) {
                        if (entities != null && entities.size() > 0) {
                            mSearchCustomEntities.clear();
                            mSearchCustomEntities.addAll(entities);
                            mSearchAdapter.notifyDataSetChanged();
                        }else{
                            if (mSearchCustomEntities!=null & mSearchCustomEntities.size()>0) {
                                mSearchCustomEntities.clear();
                                mSearchAdapter.notifyDataSetInvalidated();
                            }
                        }
                    }
                });

                results.values = mSearchCustomEntities;
                results.count = mSearchCustomEntities.size();
                return results;
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cola可洛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值