AutoComlete TextView
AutoCompleteTextView 是 Android 平台中的一个控件,它是在EditText的基础上添加了一个列表,当用户在EditText里面输入文本的时候,就会根据用户的输入内容在列表中找出匹配项,并将其显示在EditText下面。用户可以选择列表中的某一项,该项的文本就会被自动填充到EditText中。这个控件有在开发中非常多的运用,在我们日常开发中,难免会用到,本篇文章主要介绍AutoCompleteTextView的基本用法以及如何对其进行定制化设置。
1.基本用法
AutoCompleteTextView最简单的使用方式是直接在Xml文件中定义它,在布局文件中添加下面代码:
<AutoCompleteTextView
android:id="@+id/autoCompleteTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
运行程序,效果如下:

还不太好看,没有列表的内容。这是因为 AutoCompleteTextView 需要通过适配器来提供列表中的内容。
2.适配器
AutoCompleteTextView的适配器可以使用 ArrayAdapter或者 BaseAdapter,这里我们使用ArrayList作为数据源,通过自定义一个新的适配器来实现CustomAdapter类:
public class CustomAdapter extends ArrayAdapter<String> {
private ArrayList<String> mData;
public CustomAdapter(Context context, ArrayList<String> data) {
super(context,0, data);
mData = data;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
TextView textView = new TextView(getContext());
textView.setText(mData.get(position));
textView.setTextSize(18);
return textView;
}
}
上面代码定义了一个CustomAdapter类,继承了ArrayAdapter,把数据源设置成一个ArrayList。在getView方法中,将TextView作为View组件返回,并设置要显示的文本和字体大小。可以根据自己的需要设置TextView的其他属性。
3.设置数据源
在代码中我们先创建一个ArrayList,设置它的初始内容,当Text改变的时候,我们会根据改变的内容动态更新mData的内容。这里我们使用SimpleOnTextChangedListener实现。
public class MainActivity extends AppCompatActivity {
AutoCompleteTextView mAuto;
ArrayList<String> mData= new ArrayList<String>() {{
add("Apple");
add("Banana");
add("Cherry");
add("Durian");
add("Eggplant");
add("Fig");
add("Grape");
}};
CustomAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAuto = findViewById(R.id.autoCompleteTextView); //绑定控件
//新建一个自定义的适配器
mAdapter = new CustomAdapter(this, mData);
//设置Adapter
mAuto.setAdapter(mAdapter);
mAuto.addTextChangedListener(new TextWatcher(){
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
ArrayList<String> filterData = new ArrayList<>();
//根据文本改变动态更新列表
for (String item : mData){
if (item.toLowerCase().startsWith(s.toString().toLowerCase())){
filterData.add(item);
}
}
mAdapter.clear();
mAdapter.addAll(filterData);
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
}
我们可以参考上面的代码自定义实现数据源的更新,Adapter的更新等功能。例如可以把TextView替换为其他的控件,或者根据数据源的不同情况做出不同的视觉效果。
4.定制化设置
AutoCompleteTextView 除了上面介绍的基本用法之外,还有很多自定义的设置,下面介绍一些常用的设置。
1)我们可以通过 setThreshold 方法设置输入多少个字符开始匹配自动填充的文本项。例如:
mAuto.setThreshold(1); // 设置输入一个字符之后开始显示匹配的列表项
2)可以通过 setDropDownWidth 和 setDropDownHeight 方法设置下拉列表的宽度和高度。例如:
mAuto.setDropDownWidth(550); // 设置下拉列表的宽度 mAuto.setDropDownHeight(385); // 设置下拉列表的高度
3)可以通过 setDropDownVerticalOffset 方法设置下拉列表与 AutoCompleteTextView 的上边缘之间的垂直偏移量。例如:
mAuto.setDropDownVerticalOffset(dip2px(-12)); // 设置下拉列表和AutoCompleteTextView之间的垂直偏移量
4)可以通过 setDropDownBackgroundDrawable 方法或 setDropDownBackgroundResource 方法设置下来列表的背景颜色,可以通过 setDropDownHorizontalOffset 方法设置下拉列表与控件的左边缘之间的水平偏移量。例如:
mAuto.setDropDownBackgroundResource(R.drawable.autocomplete_dropdown_bg); // 设置下拉列表的背景颜色 mAuto.setDropDownHorizontalOffset(dip2px(10)); // 设置下拉列表和AutoCompleteTextView之间的水平偏移量
5)可以通过 setCompletionHint 方法设置下拉列表的提示文本。例如:
mAuto.setCompletionHint("请输入你想搜索的关键字"); //设置提示文本
6)可以通过 setDropDownAnchor 方法或 setDropDownAnchor 属性设置下拉列表的锚点,用于调整列表的位置和位置。例如:
mAuto.setDropDownAnchor(R.id.search_layout); // 设置下拉列表的锚点
7)可以通过重写 protected CharSequence convertSelectionToString(Object selectedItem) 方法来自定义返回的文本,以便在用户选择列表项时更改 AutoCompleteTextView 中的文本。例如:
protected CharSequence convertSelectionToString(Object selectedItem) {
String str = (String) selectedItem;
return str;
}
8)可以通过重写 public Filter getFilter() 方法来自定义匹配规则,以更好地匹配和搜索文本。例如:
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
//自定义匹配规则
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
//匹配结果
}
};
}
9)可以通过重写 public boolean enoughToFilter() 方法来更改触发自动填充的条件。例如:
@Override
public boolean enoughToFilter() {
return getText().length() > 1; // 输入两个字符后开始匹配
}
总之,AutoCompleteTextView 提供了非常丰富和灵活的 API,可以根据具体的需求进行定制化设置,以满足不同的业务需求。通过上述介绍,我们希望能够让大家更加深入地了解 AutoCompleteTextView,从而在实际开发中更好地应用它。
