編輯:關於Android編程
AutoCompleteTextView,很多人都用過,有些情況下使用Google提供的ArrayAdapter作為適配器就可以完成需求,但是在實際開發中,我們經常需要開發自定義適配器來完成開發工作。
今天就來看看怎麼自定義這樣一個AutoCompleteTextView。
假設我們有一個Book類,Book有四個屬性,id,name,author,price,pinyin,我希望在AutoCompleteTextView中無論輸入什麼字符,都和這五個屬性進行匹配,只要有一個匹配上就將該項數據顯示出來。要實現的效果如下圖:
要實現這樣一個功能的重點在於重寫Adapter,我們自定義一個Adapter繼承自BaseAdapter,同時實現過濾器Filterable。
繼承BaseAdapter很好寫,我們經常在ListView中使用,這裡還是一樣的。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPrzMs9BCYXNlQWRhcHRlctb30qrKtc/Wz8LD5svEuPa3vbeoo6xib29rc8rHtNO5udTst723qNbQtKu9+MC0tcTK/b7d1LShozwvcD4NCjxwcmUgY2xhc3M9"brush:java;">
@Override
public int getCount() {
return books.size();
}
@Override
public Object getItem(int position) {
return books.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
// convertView = LayoutInflater.from(context).inflate(
// R.layout.act_item, null);
convertView = View.inflate(context, R.layout.act_item, null);
viewHolder.id = (TextView) convertView.findViewById(R.id.id_book);
viewHolder.name = (TextView) convertView
.findViewById(R.id.name_book);
viewHolder.author = (TextView) convertView
.findViewById(R.id.author_book);
viewHolder.price = (TextView) convertView
.findViewById(R.id.price_book);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Book book = books.get(position);
viewHolder.id.setText(book.getId() + );
viewHolder.name.setText(book.getName());
viewHolder.author.setText(book.getAuthor());
viewHolder.price.setText(book.getPrice()+);
return convertView;
}
class ViewHolder {
TextView id, name, author, price;
}
act_item布局文件是這樣的:
同時,由於我們實現了Filterable接口,所以還要實現該接口裡邊的一個方法:
@Override
public Filter getFilter() {
if(mArrayFilter==null){
mArrayFilter = new ArrayFilter();
}
return mArrayFilter;
}
ArrayFilter是我們實現數據過濾的一個關鍵類,該類繼承自Filter,實現其中的兩個方法,第一方法時數據的過濾邏輯,第二個方法是把過濾結果賦值給數據源。
private class ArrayFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (mFilterBooks == null) {
mFilterBooks = new ArrayList(books);
}
//如果沒有過濾條件則不過濾
if (constraint == null || constraint.length() == 0) {
results.values = mFilterBooks;
results.count = mFilterBooks.size();
} else {
List retList = new ArrayList();
//過濾條件
String str = constraint.toString().toLowerCase();
//循環變量數據源,如果有屬性滿足過濾條件,則添加到result中
for (Book book : mFilterBooks) {
if (book.getAuthor().contains(str)
|| book.getName().contains(str)
|| (book.getId() + ).contains(str)
|| (book.getPrice() + ).contains(str)||book.getPinyin().contains(str)) {
retList.add(book);
}
}
results.values = retList;
results.count = retList.size();
}
return results;
}
//在這裡返回過濾結果
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
// notifyDataSetInvalidated(),會重繪控件(還原到初始狀態)
// notifyDataSetChanged(),重繪當前可見區域
books = (List) results.values;
if(results.count>0){
notifyDataSetChanged();
}else{
notifyDataSetInvalidated();
}
}
}
最重要的Adapter已經做好了,下來看看在MainActivity中怎麼調用吧:
public class MainActivity extends Activity {
private List books = new ArrayList();
private AutoCompleteTextView act;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
private void initView() {
act = (AutoCompleteTextView) this.findViewById(R.id.myact);
MyActAdapter adapter = new MyActAdapter(books, this);
act.setAdapter(adapter);
act.setThreshold(0);
}
private void initData() {
Book b1 = new Book(1, 三國演義, 羅貫中, 38, sanguoyanyi);
Book b2 = new Book(2, 紅樓夢, 曹雪芹, 25, hongloumeng);
Book b3 = new Book(3, 西游記, 吳承恩, 43, xiyouji);
Book b4 = new Book(4, 水浒傳, 施耐庵, 72, shuihuzhuan);
Book b5 = new Book(5, 隨園詩話, 袁枚, 32, suiyuanshihua);
Book b6 = new Book(6, 說文解字, 許慎, 14, shuowenjiezi);
Book b7 = new Book(7, 文心雕龍, 劉勰, 18, wenxindiaolong);
books.add(b1);
books.add(b2);
books.add(b3);
books.add(b4);
books.add(b5);
books.add(b6);
books.add(b7);
}
}
布局文件:
public class MainActivity extends Activity {
private List books = new ArrayList();
private AutoCompleteTextView act;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
private void initView() {
act = (AutoCompleteTextView) this.findViewById(R.id.myact);
MyActAdapter adapter = new MyActAdapter(books, this);
act.setAdapter(adapter);
act.setThreshold(0);
}
private void initData() {
Book b1 = new Book(1, 三國演義, 羅貫中, 38, sanguoyanyi);
Book b2 = new Book(2, 紅樓夢, 曹雪芹, 25, hongloumeng);
Book b3 = new Book(3, 西游記, 吳承恩, 43, xiyouji);
Book b4 = new Book(4, 水浒傳, 施耐庵, 72, shuihuzhuan);
Book b5 = new Book(5, 隨園詩話, 袁枚, 32, suiyuanshihua);
Book b6 = new Book(6, 說文解字, 許慎, 14, shuowenjiezi);
Book b7 = new Book(7, 文心雕龍, 劉勰, 18, wenxindiaolong);
books.add(b1);
books.add(b2);
books.add(b3);
books.add(b4);
books.add(b5);
books.add(b6);
books.add(b7);
}
}
好了,就是這麼簡單,不過這裡有一個最大的缺憾就是我們的數據源中本身帶有一個pinyin屬性,在實際的開發中肯定不能這樣,那麼我們怎麼實現通過漢字首字母來搜索呢?比如輸入sg,就會提示“三國演義”。我會在下篇文章中介紹怎麼通過Java類來實現這麼一個功能。
在android開發中會經常遇到滑動沖突(比如ScrollView或是SliddingMenu與ListView的嵌套)的問題,需要我們深入的了解android事件響應
這裡主要講解垃圾收集理論上的算法,下一篇會介紹一些實現了這些算法的垃圾收集器。一般我們談垃圾收集從三個問題來幫你理解jvm的垃圾收集策略:1.怎麼判斷哪些內存是垃圾?2.
1 概述在Android中,我們常常使用PendingIntent來表達一種“留待日後處理”的意思。從這個角度來說,PendingIntent可以
效果圖: 核心代碼: package com.zms.toast; import android.app.Dialog; import