Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android開發之自定義AutoCompleteTextView

android開發之自定義AutoCompleteTextView

編輯:關於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類來實現這麼一個功能。

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved