本文原创,转载请注明出处http://1.crazychen.sinaapp.com/?p=532
我们知道,要为AutoTextView添加自动提示,只需要为它设置一个ArrayAdapter适配器就可以了,我们开始使用这样的构造方法new ArrayAdapter(context, R.id.list_item, strArray);然后为AutoTextView设置适配器即可
我来说明一下ArrayAdapter的参数,第一个context不言而喻,我们传入当前activity.this即可
第二个是每条提示的样式,第三个是一个字符串数组,表明提示内容
我们通过传入strArray,就可以设置提示,但是这样不够灵活,如果我们要特别的需求,例如只提示与输入相关的内容,我们应该怎么做呢?
其实 ArrayAdapter是集成baseAdapdter的,我们也可以自己写一个适配器,类似ArrayAdapter的写法即可
下面的代码,主要说明复写的原理
class AutoTextViewAdapter<T> extends BaseAdapter implements Filterable{ Filter mFilter = new ArrayFilter(); private List<T> mObjects; private int mResource; private LayoutInflater mInflater; private int mDropDownResource; Context mContext; private int mFieldId = 0;//下拉框选项ID public AutoTextViewAdapter(Context context,int resource,int textViewResourceId,T[] objects) { init(context, resource, textViewResourceId, objects); } public void init(Context context,int resource,int textViewResourceId,T[] objects){ mContext = context; mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mResource = mDropDownResource = resource; mFieldId = textViewResourceId; mObjects = Arrays.asList(objects); } @Override public int getCount() { return mObjects.size(); } @Override public T getItem(int position) { return mObjects.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { return creatDropDownView(position, convertView,parent,mResource); } public View creatDropDownView(int position, View convertView,ViewGroup parent,int resource){ View view; TextView text; if (convertView == null) { view = mInflater.inflate(resource, parent, false); } else { view = convertView; } try { if (mFieldId == 0) { text = (TextView) view; } else { text = (TextView) view.findViewById(mFieldId); } } catch (ClassCastException e) { Log.e("ArrayAdapter", "You must supply a resource ID for a TextView"); throw new IllegalStateException( "ArrayAdapter requires the resource ID to be a TextView", e); } T item = getItem(position); if (item instanceof CharSequence) { text.setText((CharSequence)item); } else { text.setText(item.toString()); } return view; } @Override public Filter getFilter() { if (mFilter == null) { mFilter = new ArrayFilter(); } return mFilter; } public void setDropDownViewResource(int resource){ this.mDropDownResource = resource; } @Override public View getDropDownView(int position, View convertView,ViewGroup parent) { System.out.println("ss"); return creatDropDownView(position, convertView,parent,mDropDownResource); } class ArrayFilter extends Filter{ @Override protected FilterResults performFiltering(CharSequence arg0) { FilterResults results = new FilterResults();//创建FilterResults对象 final ArrayList<T> newValues = new ArrayList<T>(1); newValues.add((T)("aaa")); newValues.add((T)("bbb")); newValues.add((T)("ccc")); newValues.add((T)("ddd")); results.values = newValues; results.count = newValues.size(); return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { mObjects = (List<T>) results.values; notifyDataSetChanged(); } } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK){ GGView.enable=false; System.exit(0); } return true; }
我说明我们要实现自动提示效果,需要哪些必要步骤
1,要继承baseApadter,与Filterable接口,复写他们的方法
2,在构造方法里面 AutoTextViewAdapter(Context context,int resource,T[] objects)
resource是每条提示的样式,objects是输入的内容,你可以查看ArrayAdapter就知道他们的用处了,当然objects可以不传,但是传进去,是为了过滤需要,例如我传进去一个“广”,那么我们就可以利用这个参数来确定内容,例如我在数据库里面,只取以“广”开头的内容
3,baseAdapter的四个方法必须重写,所以我在类里面增加了一个List<T> mObjects,这个是用来存储处理后的提示结果数组的。特别是getView方法,其实就是方法返回提示框view,因为public View getView(int position, View convertView, ViewGroup parent) 里面有个参数parent,所以我们在这个方法里面,每次只要返回一条提示的样式内容,就会结合parent,构成完整的样式
4,ArrayFilter extends Filter必须含有这个内部类,实现performFiltering方法,我们运行适配器时,首先就会运行这个方法,所以在这里我们处理处提示数据,将他们装载在 mObjects里面
publishResults方法,会获取performFiltering的返回值,我们在这里可以做别的处理,例如把返回值付给 mObjects,使用notifyDataSetChanged()提示UI变化等
下面贴一个完整的实例代码,大家可以copy下来研究
package com.example.androidtest; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AutoCompleteTextView; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; import android.widget.TextView; public class MainActivity extends Activity{ private AutoCompleteTextView aTextView = null; private AutoTextViewAdapter<String> aTextViewAdapter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); aTextView = (AutoCompleteTextView) findViewById(R.id.EditText11); String[] str= {"sss","aaa","vvvv"}; aTextViewAdapter = new AutoTextViewAdapter<String>(this,R.layout.list_item,0,str); aTextView.setAdapter(aTextViewAdapter); //aTextView.setDropDownHeight(100) ; } class AutoTextViewAdapter<T> extends BaseAdapter implements Filterable{ Filter mFilter = new ArrayFilter(); private List<T> mObjects; private int mResource; private LayoutInflater mInflater; private int mDropDownResource; Context mContext; private int mFieldId = 0;//下拉框选项ID public AutoTextViewAdapter(Context context,int resource,int textViewResourceId,T[] objects) { init(context, resource, textViewResourceId, objects); } public void init(Context context,int resource,int textViewResourceId,T[] objects){ mContext = context; mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mResource = mDropDownResource = resource; mFieldId = textViewResourceId; mObjects = Arrays.asList(objects); } @Override public int getCount() { return mObjects.size(); } @Override public T getItem(int position) { return mObjects.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { return creatDropDownView(position, convertView,parent,mResource); } public View creatDropDownView(int position, View convertView,ViewGroup parent,int resource){ View view; TextView text; if (convertView == null) { view = mInflater.inflate(resource, parent, false); } else { view = convertView; } try { if (mFieldId == 0) { text = (TextView) view; } else { text = (TextView) view.findViewById(mFieldId); } } catch (ClassCastException e) { Log.e("ArrayAdapter", "You must supply a resource ID for a TextView"); throw new IllegalStateException( "ArrayAdapter requires the resource ID to be a TextView", e); } T item = getItem(position); if (item instanceof CharSequence) { text.setText((CharSequence)item); } else { text.setText(item.toString()); } return view; } @Override public Filter getFilter() { if (mFilter == null) { mFilter = new ArrayFilter(); } return mFilter; } public void setDropDownViewResource(int resource){ this.mDropDownResource = resource; } @Override public View getDropDownView(int position, View convertView,ViewGroup parent) { System.out.println("ss"); return creatDropDownView(position, convertView,parent,mDropDownResource); } class ArrayFilter extends Filter{ @Override protected FilterResults performFiltering(CharSequence arg0) { FilterResults results = new FilterResults();//创建FilterResults对象 final ArrayList<T> newValues = new ArrayList<T>(1); newValues.add((T)("aaa")); newValues.add((T)("bbb")); newValues.add((T)("ccc")); newValues.add((T)("ddd")); results.values = newValues; results.count = newValues.size(); return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { mObjects = (List<T>) results.values; notifyDataSetChanged(); } } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK){ GGView.enable=false; System.exit(0); } return true; } }
main
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> <AutoCompleteTextView android:id="@+id/EditText11" android:singleLine="true" android:layout_marginRight="30dp" android:layout_width="fill_parent" android:layout_height="40dip" android:completionThreshold="1" android:hint="输入站名" android:text=""/> </LinearLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff" android:padding="10dp" android:textSize="16sp" android:textColor="#000000"> </TextView>