当前位置: 源码素材网 » Android教程 » 详情页

Android AutoComplete 自动完成输入下拉提示

  •   时间:2019-05-05
  • 概述:AutoComplete 自动完成

Android 弹出智能提示信息的搜索框,AutoComplete 自动完成输入下拉提示,在具有搜索功能的App应用中,为了方便大家搜索,在输入内容时经常会有提示性的内容。本实例主要使用AutoCompleteTextVww控件实现智能提示信息的功能。运行实例,单击搜索输入框,输入“书名”,弹出相关提示信息,当沒单击提示信息中的某一项, 内容自动添加到搜索框内。

本实例主要使用自定义MyAdapter类中的getView()方法、View类中的inflate()方法、TextView 类中的 setText()方法、ArrayFilter 类中的 performFiltering()方法、Array Filter 类中的 publishResults()方 法,实现智能提示信息的功能。

/初始化方法
public MyAdapter(List<Book> mList, Context context) {
    this.books = mList;
    this.context = context;
}
//数组长度
@Override
public int getCount() {
    return books==null ? 0:books.size();
}
@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return books.get(position);
}
@Override
public long getItemId(int position) {
    return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view;
    ViewHolder holder;
    if(convertView==null){
        view = View.inflate(context, R.layout.list_item, null);
        holder = new ViewHolder();
        holder.tv_name = (TextView) view.findViewById(R.id.bookname);
        view.setTag(holder);
    }else{
        view = convertView;
        holder = (ViewHolder) view.getTag();
    }
    Book bookname = books.get(position);
    holder.tv_name.setText(bookname.getBookname());
    return view;
}
static class ViewHolder{
    public TextView tv_name;
}
时,由于我们实现了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<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.getBookname().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<Book>) results.values;
        if(results.count>0){
            notifyDataSetChanged();
        }else{
            notifyDataSetInvalidated();
        }
    }
}

尝试在MainActivity类中修改提示信息的内容。完整源代码,可以在此下载:

    相关声明:

      若“Android AutoComplete 自动完成输入下拉提示”有损您的权益,请告之我们删除内容。
      部分文章来源于网络,版权归原作者所有。