AutoCompleteTextView是一个android提供的可以补全输入的textview,效果类似于PC端百度一下那个输入框下面会带出来搜索历史。
先看下效果图:
我采用了自定义adapter的方式给他增加了删除的功能(单击x会删除那一条记录)
结合上SharedPerferences很容易就实现了输入历史记录提示功能。
实现步骤:
xml布局中添加AutoCompleteTextView
<AutoCompleteTextView
android:id="@+id/actv_text"
android:layout_width="match_parent"
android:layout_height="50dp"
android:hint="请输入服务器地址"
android:layout_margin="5dp"
android:singleLine="true"
android:imeOptions="actionNext"/>
Activity中对其进行设置
//我自定义的适配器下面有代码
AutoAdapter adapter = new AutoAdapter(this,R.layout.rv_item_auto,list);
//也可以使用系统自带的
//ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,list);
acText.setAdapter(adapter);
acText.setThreshold(1);//设置输入几个字符后开始出现提示 默认是2
//我想在控件准备输入时直接弹出 所以设置了onFocusChange事件
acText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus){//获取焦点时
acText.showDropDown();
}
}
});
在写自定义适配器的时候一定要实现Filterable,要不然会失效。
其他地方和正常写Baseadapter是一样的
适配器的布局代码很简单 一个textview(显示提示内容)一个imageview(显示x)就不再贴代码了
AutoAdpater自定义适配器的代码
public class AutoAdapter extends BaseAdapter implements Filterable {
Context mContext;
List<String> mList;
List<String> data;
int mResource;
public AutoAdapter(@NonNull Context context, int resource, List<String> list) {
mContext = context;
mList = list;
mResource = resource;
}
@Override
public int getCount() {
return mList==null?0:mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@NonNull
@Override
public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(mResource,null);
TextView tvAuto = view.findViewById(R.id.tv_auto);
ImageView ivClose = view.findViewById(R.id.iv_delete);
tvAuto.setText(mList.get(position));
ivClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mList.remove(position);
notifyDataSetChanged();
}
});
return view;
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
List<String> list = new ArrayList<>();
if(constraint != null){
for (String s:mList) {
list.add(s);
}
}
results.count = list.size();
results.values = list;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
data = (List<String>) results.values;
notifyDataSetChanged();
}
};
return filter;
}
}