實現了一個自定義帶刪除歷史記錄的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="" />