AutoCompleteTextView 下拉列表 可编辑 逐渐提示

AutoCompleteTextView 下拉列表 可编辑 逐渐提示

package com.river.searchEdit;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AutoCompleteTextView;
import android.widget.LinearLayout;

import com.river.searchEdit.util.SearchAdapter;


public class MainActivity extends Activity implements View.OnFocusChangeListener  {
    private AutoCompleteTextView search;
    private String[] str = {"上海", "香港", "深圳", "武汉", "新加坡"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        search = (AutoCompleteTextView) findViewById(R.id.search);
        SearchAdapter<String> adapter = new SearchAdapter<String>(MainActivity.this, str);
        search.setAdapter(adapter);
        search.setOnFocusChangeListener(MainActivity.this);
    }


    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        AutoCompleteTextView view = (AutoCompleteTextView) v;
        if (hasFocus) {
            view.showDropDown();
        }
    }

}

package com.river.searchEdit.util;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
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 java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class SearchAdapter<T> extends BaseAdapter implements Filterable {
    private List<T> mObjects;
    private List<Set<String>> pinyinList;
    private ArrayList<T> mOriginalValues;
    private ArrayFilter mFilter;
    private LayoutInflater mInflater;

    public SearchAdapter(Context context, T[] objects) {
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mObjects = Arrays.asList(objects);
        this.pinyinList = getHanziSpellList(objects);
    }

    private List<Set<String>> getHanziSpellList(T[] hanzi) {
        List<Set<String>> listSet = new ArrayList<Set<String>>();
        PinYin4j pinyin = new PinYin4j();
        for (int i = 0; i < hanzi.length; i++) {
            listSet.add(pinyin.getPinyin(hanzi[i].toString()));
        }
        return listSet;
    }

    public int getCount() {
        return mObjects.size();
    }

    public T getItem(int position) {
        return mObjects.get(position);
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        return createViewFromResource(position, convertView, parent, android.R.layout.simple_list_item_1);
    }

    private View createViewFromResource(int position, View convertView, ViewGroup parent, int resource) {
        View view;
        TextView text;
        if (convertView == null) {
            view = mInflater.inflate(resource, parent, false);
        } else {
            view = convertView;
        }
        text = (TextView) view;
        text.setText(getItem(position).toString());
        return view;
    }

    public Filter getFilter() {
        if (mFilter == null) {
            mFilter = new ArrayFilter();
        }
        return mFilter;
    }

    private class ArrayFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence prefix) {
            FilterResults results = new FilterResults();
            if (mOriginalValues == null) {
                mOriginalValues = new ArrayList<T>(mObjects);
            }
            if (prefix == null || prefix.length() == 0) {
                ArrayList<T> list = new ArrayList<T>(mOriginalValues);
                results.values = list;
                results.count = list.size();
            } else {
                String prefixString = prefix.toString().toLowerCase();
                final ArrayList<T> hanzi = mOriginalValues; // 汉字String
                final Set<T> newValues = new HashSet<T>(hanzi.size()); // 支持多音字,不重复
                for (int i = 0; i < hanzi.size(); i++) {
                    final T value = hanzi.get(i); // 汉字String
                    final String valueText = value.toString().toLowerCase(); // 汉字String
                    final Set<String> pinyinSet = pinyinList.get(i);
                    Iterator iterator = pinyinSet.iterator();
                    while (iterator.hasNext()) {
                        final String pinyin = iterator.next().toString().toLowerCase(); // 取出多音字里的一个字母
                        if (pinyin.indexOf(prefixString) != -1) {
                            newValues.add(value);
                        } else if (valueText.indexOf(prefixString) != -1) { // 如果是汉字则直接添加
                            newValues.add(value);
                        }
                    }
                }
                List<T> list = Set2List(newValues);
                results.values = list;
                results.count = list.size();
            }
            return results;
        }

        @SuppressWarnings("unchecked")
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mObjects = (List<T>) results.values;
            if (results.count > 0) {
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }
        }
    }

    @SuppressWarnings("hiding")
    public <T extends Object> List<T> Set2List(Set<T> oSet) {
        List<T> tList = new ArrayList<T>(oSet);
        return tList;
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:orientation="vertical">

    <AutoCompleteTextView
        android:id="@+id/search"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:layout_margin="100dp"
        android:background="@color/colorPrimary"
        android:completionThreshold="1"
        android:dropDownWidth="180dp"
        android:dropDownHeight="200dp"
        android:hint="输入名称或拼音首字母"
        android:imeOptions="actionSearch"
        android:maxLength="12"
        android:singleLine="true"
        android:textColor="#317F6D"
        android:textColorHint="#317F6D"
        android:textCursorDrawable="@drawable/edittext_cursor"
        android:textSize="15sp" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.river.searchEdit">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.river.searchEdit.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值