在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,这种效果在Android中是用AutoCompleteTextView实现的。
<AutoCompleteTextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/autotext" />
public class MainActivity extends Activity { private AutoCompleteTextView autotext; private ArrayAdapter<String> arrayAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); autotext =(AutoCompleteTextView) findViewById(R.id.autotext); String [] arr={"aa","aab","aac"}; arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,arr); autotext.setAdapter(arrayAdapter); } }
AutoCompleteTextView常用属性 | |
---|---|
android:completionHint | 设置出现在下拉菜单中的提示标题 |
android:completionThreshold | 设置用户至少输入多少个字符才会显示提示 |
android:dropDownHorizontalOffset | 下拉菜单于文本框之间的水平偏移。默认与文本框左对齐 |
android:dropDownHeight | 下拉菜单的高度 |
android:dropDownWidth | 下拉菜单的宽度 |
android:singleLine | 单行显示 |
android:dropDownVerticalOffset | 垂直偏移量 |
========================================
自定义适配器
========================================
最近项目中需要做搜索功能,实现类似 Google、Baidu 搜索的 下拉提示效果。android为我们提供了 AutoCompleteTextView 控件来完成此功能。
网上好多例子都是简单使用 ArrayAdapter 来实现的,界面比较简单,实际项目中用处不大;自己研究了一番,自定义Adapter 继承BaseAdapter 并实现Filterable 接口 实现了上述功能。
运行效果截图
自定义Adapter
注意:一定要实现 Filterable 接口,否则无效
MainActivity 布局文件
phone_item.xml
二次修改 适配器 BUG 修复显示红色输入问题
// BaseAdapter implements Filterable
// implements ListAdapter, Filterable
==================================================
import java.util.ArrayList;
import android.content.Context;
import android.database.DataSetObserver;
import android.text.Html;
import android.text.Spanned;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ListAdapter;
import android.widget.TextView;
public class AutoViewArrayAdapter extends BaseAdapter implements Filterable {
// BaseAdapter implements Filterable
// implements ListAdapter, Filterable
String[] strs;
Context conx;
MyFilter myFilter;
/**
* 输入框中当前的关键字
*/
String tempKeyString;
public AutoViewArrayAdapter(String[] strs, Context conx)
{
super();
this.strs = strs;
this.conx = conx;
}
@Override
public int getCount()
{
return strs.length;
}
@Override
public Object getItem(int position)
{
return strs[position];
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
Log.i("---position---", "" + position);
TextView tx = new TextView(conx);
View view = View.inflate(conx, android.R.layout.simple_list_item_1, null);
tx = (TextView)view.findViewById(android.R.id.text1);
String temp1 = strs[position];
//使用网页来显示字体
String strText =
"<font color= 'red' type='bold'>"+ tempKeyString + "</font>"
+ "<font color= 'black' type='bold'>" + temp1.substring(tempKeyString.length(), temp1.length()) + "</font>" ;
Spanned fromHtml = Html.fromHtml(strText);
tx.setText(fromHtml);
return tx;
}
@Override
public Filter getFilter()
{
//自定义的拦截器,对包含的关键字进行处理
if (null == myFilter)
{
myFilter = new MyFilter();
}
return myFilter;
}
/**
* Filter就是一个拦截器和过滤器,(就是给自动完成文本框的一个拦截器)我们在使用自动完成文本框的时候
* @author pqp66011
*/
class MyFilter extends Filter {
String[] strsContains;
public MyFilter()
{
super();
strsContains = strs;
}
/**
*在这个方法里执行过滤方法
*/
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
Log.i(" constraint ", "constraint == " + constraint);
//filterREsults是filter的一个结果对象,里面只包括两个成员属性,Object 和 count
FilterResults result = new FilterResults();
//定义一个集合来保存数组中存在的关键字的字符串
ArrayList<String> strsTemp = new ArrayList<String>();
//在这里可以获取autoCompeted中输入的信息
//把字符串中包含这个关键字的item返回给adapter.
if (null != constraint && constraint.length() > 0)
{
for (int i = 0; i < strsContains.length; i++)
{
String tempstr = strsContains[i];
//同一做大小写的处理
if (tempstr.toLowerCase().contains(constraint.toString()
.toLowerCase()))//包含关键字的添加进去
{
strsTemp.add(tempstr);
}
}
result.values = strsTemp;
result.count = strsTemp.size();
}
//这个结果集 将会返回给 publishResults 方法中的 FilterResults results这个参数 所以我们在下面获取
return result;
}
/**
* 在这个方法里发布筛选过后得到的数据同时更新Adapter更新
*/
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
{
ArrayList<String> tempList = (ArrayList<String>) results.values;
if (null != tempList)
{
String[] strsTemps = new String[tempList.size()];
for (int i = 0; i < tempList.size(); i++)
{
strsTemps[i] = tempList.get(i);
}
strs = strsTemps;
//这个时候输入的关键字
tempKeyString = constraint.toString();
// notifyDataSetInvalidated();
}
notifyDataSetChanged();
}
}
}