Android05--Android之AutoCompleteTextView+MultiAutoCompleteTextView

1.AutoCompleteTextView(自动补全)

首先是自动补全的一个下拉列表
各个属性的含义:

<AutoCompleteTextView
        android:id="@+id/auto_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        // 设定几个字母之后开始匹配,忽略大小写的.
        android:completionThreshold="1"
        android:completionHint="自动补全"
/>

简单的自动提示:中文也支持,但只会根据第一个字母或者汉字去匹配.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        List<String> list = new ArrayList<>();
        list.add("String");
        list.add("Integer");
        list.add("Float");
        list.add("Double");
        list.add("Byte");
        list.add("Long");
        list.add("Boolean");
        list.add("Bool");
        list.add("北京");
        list.add("上海北京");
        // 忽略大小写的匹配,adapter必须实现过滤
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, list);
        AutoCompleteTextView auto = (AutoCompleteTextView) findViewById(R.id.auto_main);
        auto.setAdapter(adapter);

    }

效果:

这里写图片描述

2.中文匹配:(根据中文的拼音去匹配)

中文匹配的过程中,思想在于根据没个城市的拼音首字母来显示对应的城市.不说了,看代码:一个简单的例子

// OnCreate函数中:
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AutoCompleteTextView auto = (AutoCompleteTextView) findViewById(R.id.mian_auto);

        List<Entry> list = new ArrayList<>();
        list.add(new Entry("北京", "beijing"));
        list.add(new Entry("上海", "shanghai"));
        list.add(new Entry("天津", "tianjin"));
        list.add(new Entry("重庆", "chongqing"));
        list.add(new Entry("河北", "hebei"));
        list.add(new Entry("河南", "henan"));
        list.add(new Entry("山东", "shandong"));
        AutoAdapter adapter = new AutoAdapter(this, list);
        auto.setAdapter(adapter);
    }
布局和自动补全的布局一样
// adapter端:
package com.xiaohong.auto_myself.adapter;
import android.content.Context;
import android.text.TextUtils;
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 com.xiaohong.auto_myself.entry.Entry;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class AutoAdapter extends BaseAdapter implements Filterable {

    private Context context;
    private List<Entry> list;
    private List<Entry> backup;
    private Filter filter;


    public AutoAdapter(Context context, List<Entry> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = new TextView(context);
        }
        ((TextView) convertView).setText(list.get(position).getText());
        return convertView;
    }

    // 定义一个过滤器,只要是Adapter,都会有过滤器的,有的是适配器自己实现,特殊功能需要自己手写.
    // 过滤器,就是根据你想啥,他就给你过滤啥.哈哈
    // 比如,一袋子零钱,但是你只想要面值最大的的,过滤器就会找出面值最大的钞票啊...
    @Override
    public Filter getFilter() {
        if (filter == null) {
            filter = new AutoFilter();
        }
        return filter;
    }

    public class AutoFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            if (backup == null) {
                backup = new ArrayList<>(list);
            }

            FilterResults results = new FilterResults();
            if (!TextUtils.isEmpty(constraint)) {
                ArrayList<Entry> entries = new ArrayList<>();
                for (Entry entry : backup) {
                    if (entry.getPinyin().startsWith(constraint.toString())) {
                        entries.add(entry);
                    }
                }
                results.count = entries.size();
                results.values = entries;
            } else {
                results.count = 0;
                results.values = new ArrayList<>();
            }
            return results;
        }

        // 结果返回
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            list.clear();
            list.addAll(((Collection<? extends Entry>) results.values));
            notifyDataSetChanged();
        }
    }
}

效果:
这里写图片描述

目前,我们可以采用第三方的库去实现补全,很方便的哟……

3.MultiAutoCompleteTextView

多补全:用处,在短信发送个所个小朋友的时候,就用到啦.
和第二个例子相比不用改太多:

 List<Entry> list1 = new ArrayList<>();
        list1.add(new Entry("北京","beijing"));
        list1.add(new Entry("上海","shanghai"));
        list1.add(new Entry("天津","tianjin"));
        list1.add(new Entry("重庆","chongqing"));
        list1.add(new Entry("河北","hebei"));
        list1.add(new Entry("河南","henan"));
        list1.add(new Entry("山东","shandong"));
        // 多补全
        AutoAdapter autoAdapter = new AutoAdapter(this, list1);
        MultiAutoCompleteTextView multi = (MultiAutoCompleteTextView) findViewById(R.id.muti_main_auto);
        multi.setAdapter(adapter);
        MultiAutoCompleteTextView.CommaTokenizer tokenizer = new MultiAutoCompleteTextView.CommaTokenizer();
        tokenizer.terminateToken(",");

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值