自定義AutoCompleteTextView

實現了一個自定義帶刪除歷史記錄的AutoCompleteTextView

思路是自定義一個適配器用來篩選所需要過濾的數據源並將數據源加載在一個BaseAdapter中

1.首先自定義一個適配器:AutocompleteAdapter

package com.example.dragviewhelperdemo.adapter;

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

import android.content.Context;
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.TextView;
import android.widget.Toast;

public class AutocompleteAdapter extends BaseAdapter implements Filterable{

	private ArrayList<String> resourseData;
	private ArrayList<String>mResults;
	private Context context;
	private int maxDisplayItem=5;
	private OnClickListener clickListener;
	/**
	 * 
	 * @param context 上下文
	 * @param resourseData 數據源
	 * @param maxDisplayItem 顯示的最大條目數負數爲全部加載
	 */
	public AutocompleteAdapter(Context context, ArrayList<String> resourseData,
			OnClickListener listener,int maxDisplayItem) {
		this.resourseData = resourseData;
		this.context = context;
		this.maxDisplayItem = maxDisplayItem;
		this.clickListener=listener;
	}

	@Override
	public Filter getFilter() {
		ArrayFilter filter = null;
		if(filter==null)
			filter=new ArrayFilter();
		return filter;
	}
	
	
	class ArrayFilter extends Filter{
		FilterResults results=new FilterResults();
		private final Object mLock = new Object();  
		
		@Override
		protected FilterResults performFiltering(CharSequence constraint) {
			if(constraint==null||constraint.length()==0){
				synchronized (mLock) {
					ArrayList<String>resultForResult=new ArrayList<String>();
					resultForResult=resourseData;
					results.count=resultForResult.size();
					results.values=resultForResult;
				}
			}
			else{
				String preConstr=constraint.toString().toLowerCase();//索引的字符
				int count = resourseData.size();    
                ArrayList<String> resultForResult = new ArrayList<String>();
                for(int i=0;i<count;i++){
                	String resultForResultItem = resourseData.get(i);
                	String resultForResultItemText = resultForResultItem.toLowerCase();//存儲的數據中單個數據    
                	if(resultForResultItemText.startsWith(preConstr)){//單個數據中是否從開始包含索引字符
                		resultForResult.add(resultForResultItem);
                	}
                	if(resultForResult.size()>maxDisplayItem)// 當索引字符出的條目數大於maxDisplayItem時跳出加入結果集
                		break;
                }
                resultForResult.add("清除歷史記錄");
                results.count=resultForResult.size();
                results.values=resultForResult;
			}
			return results;
		}
		@Override
		protected void publishResults(CharSequence constraint,
				FilterResults results) {
			ArrayList<String> mResults = (ArrayList<String>) results.values;  
			setResults(mResults);
            if (results.count > 0) {    
                notifyDataSetChanged();    
            } else {    
                notifyDataSetInvalidated();    
            }  
        }  
	}
	
	
	
	@Override
	public int getCount() {
		if(getResults()==null)
			return resourseData.size();
		else
			return getResults().size();
	}
	@Override
	public Object getItem(int position) {
		if(getResults()==null)
			return resourseData.get(position);
		return getResults().get(position);
	}
	@Override
	public long getItemId(int position) {
		return position;
	}
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		TextView tv=new TextView(context);
		if(getResults()==null)
			tv.setText(resourseData.get(position));
		else
				tv.setText(getResults().get(position));
		
		if(getResults()!=null&&getResults().size()==resourseData.size()&&position==getResults().size()-1){
		}else if(getResults()!=null&&position==getResults().size()-1){
			tv.setOnClickListener(clickListener);
		}
		return tv;
	}

	
	
	public ArrayList<String> getResults(){
		return mResults;
	}
	
	public void setResults(ArrayList<String> results){
		this.mResults=results;
	}
}


2.用於界面展示的AutoCompleteActivity

package com.example.dragviewhelperdemo;

import java.util.ArrayList;

import com.example.dragviewhelperdemo.adapter.AutocompleteAdapter;

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

public class AutoCompleteActivity extends Activity {
	private AutoCompleteTextView mAct;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_auto_complete);
		mAct=(AutoCompleteTextView) findViewById(R.id.act);
		final ArrayList<String>resourseData=new ArrayList<String>();
		resourseData.add("aaaaaaaaaaaaaaa");
		resourseData.add("aaaaaaaaaaaaaag");
		resourseData.add("aaaaaaaaaaaaaag");
		resourseData.add("aaaaaaaaaaaaaaga");
		resourseData.add("aaaaaaaaaaaaggaaa");
		resourseData.add("aaaaaaaaaaaag8aaa");
		resourseData.add("bbbbbbbbbbbbbb");
		resourseData.add("cccccccccccccc");
		resourseData.add("ddddddddddd");
		resourseData.add("eeeeeeeeeee");
		resourseData.add("fffffffffffff");
		resourseData.add("gggggggggg");
		AutocompleteAdapter  adapter=new AutocompleteAdapter(this, resourseData, new OnClickListener() {
			@Override
			public void onClick(View v) {
				resourseData.clear();
				Toast.makeText(AutoCompleteActivity.this, "已全部清除", 0).show();
			}
		}, 5);
		mAct.setAdapter(adapter);
		mAct.setThreshold(1);
		mAct.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mAct.showDropDown();
			}
		});
			
			
	}
}


3.用到的佈局

</pre><p><pre name="code" class="java"><?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:orientation="vertical" >
    
<AutoCompleteTextView 
    android:layout_width="150dp"
    android:layout_height="50dp"
    android:id="@+id/act"
    android:background="#55ffaaff"
    />
<Button 
    android:id="@+id/submit"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:text="提交"
    />
</LinearLayout>
</pre><pre name="code" class="java">
4.佈局裏面的提交按鈕沒有用到,看一下效果圖
https://img-blog.csdn.net/20151027154907535?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"<img src="https://img-blog.csdn.net/20151027155254371?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章