AutoTextView自定义自动提示

本文原创,转载请注明出处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>

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值