欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android AutoCompleteTextView控件使用实例

程序员文章站 2023-08-29 20:12:00
使用要点如下: 1.利用listadapter(一般使用arrayadapter)为autocompletetextview提供数据,若有需要还可以重载getview()...

使用要点如下:

1.利用listadapter(一般使用arrayadapter)为autocompletetextview提供数据,若有需要还可以重载getview()以自定义列表项的显示方式。这一步同listview。
2.如果需要根据输入内容进行动态提示,那么adapter需要实现filterable接口,重载getfilter()函数实现提示算法。getfilter()需返回filter对象,该对象包含至少两个方法:performfiltering()在后台执行过滤,publishresults()在ui线程执行,负责将过滤结果显示到列表中。还有第三个方法convertresulttostring()可以控制用户点击提示时要填充至输入框的文本内容。

示例代码如下:

复制代码 代码如下:

autocompletetextview autocomplete = new autocompletetextview(context);
autocomplete.setthreshold(2);      // 设置最少几个字符触发自动完成
myadapter adapter = new myadapter(context);
autocomplete.setadapter(adapter);

/**
 * adapter定义
 */
class myadapter extends arrayadapter<myobject> implements filterable{

    @override
    public view getview(int position, view convertview, viewgroup parent) {
        // define your list item view here 在此处定义列表项的视图
    }

    /**
     * 实现自动完成的过滤算法
     */
    @override
    public filter getfilter() {
        filter filter = new filter() {

            /**
             * 本方法在后台线程执行,定义过滤算法
             */
            @override
            protected filterresults performfiltering(charsequence constraint) {
                string keyword = string.valueof(constraint).tolowercase();
                // 此处实现过滤

                // 过滤后利用filterresults将过滤结果返回
                filterresults filterresults = new filterresults();
                filterresults.values = results;   // results是上面的过滤结果
                filterresults.count = results.size();  // 结果数量

                return filterresults;
            }

            /**
             * 本方法在ui线程执行,用于更新自动完成列表
             */
            @override
            protected void publishresults(charsequence constraint, filterresults results) {
                if (results != null && results.count > 0) {
                    // 有过滤结果,显示自动完成列表
                    myadapter.this.clear();   // 清空旧列表
                    myadapter.this.addall((list<myobject>)results.values);
                    notifidatasetchanged();
                } else {
                    // 无过滤结果,关闭列表
                    notifydatasetinvalidated();
                }
            }

            /**
             * 如果需要控制提示文本的显示方式,重载此函数
             */
            @override
            public charsequence convertresulttostring(object resultvalue) {
                myobject obj = (myobject) resultvalue;
                return obj.name;
            }

        };
    }
}