android properties-为什么 autocompletetextview

问题描述

为什么 autocompletetextview

为什么 autocompletetextview 用了直接写的 adapter showdropdown 没有效果了啊
下面是我写的adapter

package com.depart.adapter;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import com.depart.autocomplete.R;
import com.depart.db.HistorySQLiteOpenHelper;

public class AutoCompleteAdapter extends BaseAdapter implements Filterable{

    private Context context;
    private ArrayFilter mFilter;
    private ArrayList<String> mOriginalValues;//所有的Item
    private List<String> mObjects;//过滤后的item
    private final Object mLock = new Object();
    private int maxMatch=10;//最多显示多少个选项,负数表示全部
    public AutoCompleteAdapter(Context context,ArrayList<String> mOriginalValues,int maxMatch){
        this.context=context;
        this.mOriginalValues=mOriginalValues;
        this.maxMatch=maxMatch;
    }
    public AutoCompleteAdapter(){

    }

    @Override
    public Filter getFilter() {
        // TODO Auto-generated method stub
        if (mFilter == null) {
            mFilter = new ArrayFilter();
        }
        return mFilter;
    }

    public void refresh(){

        notifyDataSetChanged();
    }
    private class ArrayFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence prefix) {
            // TODO Auto-generated method stub
            FilterResults results = new FilterResults();  

//          if (mOriginalValues == null) {
//                synchronized (mLock) {
//                    mOriginalValues = new ArrayList<String>(mObjects);//
//                }
//            }
            System.out.println("prefix:"+prefix);
            if (prefix == null || prefix.length() == 0) {
                synchronized (mLock) {
                    Log.i("tag", "mOriginalValues.size="+mOriginalValues.size());
                    ArrayList<String> list = new ArrayList<String>(mOriginalValues);
                    results.values = list;
                    results.count = list.size();
                    return results;
                }
            } else {
                String prefixString = prefix.toString().toLowerCase();
                if(prefixString==null){
                    prefixString="1";
                }
                final int count = mOriginalValues.size();  

                final ArrayList<String> newValues = new ArrayList<String>(count);  

                for (int i = 0; i < count; i++) {
                    final String value = mOriginalValues.get(i);
                    final String valueText = value.toLowerCase();  

                    if(valueText.contains(prefixString)){//匹配所有
                         newValues.add(value);
                    }
                    // First match against the whole, non-splitted value
                  /*  if (valueText.startsWith(prefixString)) {  //源码 ,匹配开头
                        newValues.add(value);
                    } */
//                    else {
//                        final String[] words = valueText.split(" ");//分隔符匹配,效率低
//                        final int wordCount = words.length;
//
//                        for (int k = 0; k < wordCount; k++) {
//                            if (words[k].startsWith(prefixString)) {
//                                newValues.add(value);
//                                break;
//                            }
//                        }
//                    }
                    if(maxMatch>0){//有数量限制
                        if(newValues.size()>maxMatch-1){//不要太多
                            break;
                        }
                    }
                }  

                results.values = newValues;
                results.count = newValues.size();
            }  

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            // TODO Auto-generated method stub
            mObjects = (List<String>) results.values;
            if (results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        if(mObjects!=null){
            return mObjects.size();
        }
        return 0;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        //此方法有误,尽量不要使用
        return mObjects.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder = null;
        if(convertView==null){
            holder=new ViewHolder();
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=inflater.inflate(R.layout.simple_list_item_for_autocomplete, null);
            holder.tv=(TextView)convertView.findViewById(R.id.simple_item_0);
            holder.iv=(ImageView)convertView.findViewById(R.id.simple_item_1);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        holder.tv.setText(mObjects.get(position));
        holder.iv.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String obj=mObjects.remove(position);
                mOriginalValues.remove(obj);

            /*  Cursor c = new HistorySQLiteOpenHelper(context).getWritableDatabase().
                query("history", new String []{"_id","name"}, "name = ? ", new String[]{obj}, null, null, null, null);*/
                new HistorySQLiteOpenHelper(context).getWritableDatabase().
                delete("history", "name = ? ", new String[]{obj});

                notifyDataSetChanged();
            }

        });
        return convertView;
    }
    public void showd(){

    }
    class ViewHolder {
        TextView tv;
        ImageView iv;
    }

    public ArrayList<String> getAllItems(){
        return mOriginalValues;
    }
}

时间: 2024-09-17 04:07:07

android properties-为什么 autocompletetextview的相关文章

实例讲解Android中的AutoCompleteTextView自动补全组件_Android

AutoCompleteTextView是一个具有自动补全功能的EditView,当用户输入数据后,AutoCompleteTextView就会将用户输入的数据与他自己的adapter中的数据对比,如果用户数据与adapter中的某条数据的开始部分完全匹配,那么adapter中的这条数据就会出现在下拉提示框中. 其常用属性定义如下 <AutoCompleteTextView android:id="@+id/mp002_top_place_input" android:layou

Android中的AutoCompleteTextView的使用

最终的效果如下: main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_par

基于Android中的 AutoCompleteTextView实现自动填充_Android

现在我们上网会用百度或者谷歌搜索信息,当我们在输入框里输入一两个字后,就会自动提示我们想要的信息,这种效果在Android 是通过Android 的AutoCompleteTextView Widget 搭配ArrayAdapter 设计同类似Google 搜索提示的效果. 先在Layout 当中布局一个AutoCompleteTextView Widget ,然后通过预先设置好的字符串数组,将此字符串数组放入ArrayAdapter ,最后利用AutoCompleteTextView.setA

实例讲解Android中的AutoCompleteTextView自动补全组件

AutoCompleteTextView是一个具有自动补全功能的EditView,当用户输入数据后,AutoCompleteTextView就会将用户输入的数据与他自己的adapter中的数据对比,如果用户数据与adapter中的某条数据的开始部分完全匹配,那么adapter中的这条数据就会出现在下拉提示框中. 其常用属性定义如下 <AutoCompleteTextView android:id="@+id/mp002_top_place_input" android:layou

Android中使用 AutoCompleteTextView 实现手机号格式化附带清空历史的操作

有个小伙伴遇到了这样一个问题,就是AutoCompleteTextView实现自动填充的功能.同时要具备手机格式化的功能.下拉列表最后一行是有个清除历史的功能.可是点击"清除历史"却把文字要设置进去AutoCompleteTextView中.这样的效果显然很糟糕.所以我就写了这样一个简单的demo.来帮助遇到这种问题的朋友解决这样一个问题.二话不多说直接上代码. 布局文件(activity_main.xml)代码如下: <?xml version="1.0"

Android中AutoCompleteTextView与MultiAutoCompleteTextView的用法_Android

本文以实例列举了Android中AutoCompleteTextView与MultiAutoCompleteTextView的使用方法,具体使用方法如下: 首先看AutoCompleteTextView的使用: 支持基本的自动完成功能,适用在各种搜索功能中,并且可以根据自己的需求设置他的默认显示数据.两个控件都可以很灵活的预置匹配的那些数据,并且可以设置输入多少值时开始匹配等等功能.布局文件很简单,如下所示: <LinearLayout xmlns:android="http://sche

Android中AutoCompleteTextView与TextWatcher结合小实例_Android

AutoCompleteTextView是实现动态匹配输入内容的一种输入框(EditText),如输入"and"时,会提示"Android" 效果图: 实现代码: package com.conowen.test; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import an

Android AutoCompleteTextView自动提示文本框实例代码_Android

 自动提示文本框(AutoCompleteTextView)可以加强用户体验,缩短用户的输入时间(百度的搜索框就是这个效果). 先给大家展示下效果图,如果大家感觉还不错,请参考实现代码:   最后一张获取文本框里面的值(其实就跟TextView.EditText一样): 首先,在xml中定义AutoCompleteTextView控件: activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/ap

Android中AutoCompleteTextView完整示例(一)

MainActivity如下: package cc.testautocompletetextview; import cc.testautocompletetextview1.R; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.AutoCompleteTextView; import android.app.Activity; /** * Demo描述 * AutoComp