android开发之自定义AutoCompleteTextView

AutoCompleteTextView,很多人都用过,有些情况下使用Google提供的ArrayAdapter作为适配器就可以完成需求,但是在实际开发中,我们经常需要开发自定义适配器来完成开发工作。

今天就来看看怎么自定义这样一个AutoCompleteTextView。 假设我们有一个Book类,Book有四个属性,id,name,author,price,pinyin,我希望在AutoCompleteTextView中无论输入什么字符,都和这五个属性进行匹配,只要有一个匹配上就将该项数据显示出来。要实现的效果如下图:

要实现这样一个功能的重点在于重写Adapter,我们自定义一个Adapter继承自BaseAdapter,同时实现过滤器Filterable。 继承BaseAdapter很好写,我们经常在ListView中使用,这里还是一样的。

继承BaseAdapter主要实现下面四个方法,books是从构造方法中传进来的数据源。

@Overridepublic int getCount() {return books.size();}@Overridepublic Object getItem(int position) {return books.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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布局文件是这样的:

==”match_parent”android:orientation=”horizontal” ><TextView==”center”android:text=”id” /><TextView==”center”android:text=”name” /><TextView==”center”android:text=”author” /><TextView==>

同时,由于我们实现了Filterable接口,所以还要实现该接口里边的一个方法:

@Overridepublic Filter getFilter() {if(mArrayFilter==null){mArrayFilter = new ArrayFilter();}return mArrayFilter;}ArrayFilter是我们实现数据过滤的一个关键类,,该类继承自Filter,实现其中的两个方法,第一方法时数据的过滤逻辑,第二个方法是把过滤结果赋值给数据源。 Filter {@Overrideprotected FilterResults performFiltering(CharSequence constraint) {FilterResults results = new FilterResults();if (mFilterBooks == null) {mFilterBooks = new ArrayList<Book>(books);}//如果没有过滤条件则不过滤if (constraint == null || constraint.length() == 0) {results.values = mFilterBooks;results.count = mFilterBooks.size();} else {List<Book> retList = new ArrayList<Book>();//过滤条件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;}//在这里返回过滤结果@Overrideprotected void publishResults(CharSequence constraint,FilterResults results) {//notifyDataSetInvalidated(),会重绘控件(还原到初始状态)//notifyDataSetChanged(),重绘当前可见区域books = (List<Book>) results.values;if(results.count>0){notifyDataSetChanged();}else{notifyDataSetInvalidated();}}}缘是浪漫的相遇,瞬间让你我的心化为永恒!

android开发之自定义AutoCompleteTextView

相关文章:

你感兴趣的文章:

标签云: