java - AutoCompleteTextView 不起作用
问题描述
我正在做一个计费应用程序,稍后应将项目保存到数组列表中数组列表。我想也许可能有任何错误,但它无法在任何地方找到它,因为我可能错过了适配器中的某些内容。那么有人可以帮我解决这个问题吗?谢谢
这是我的适配器
public class AutoSuggestAdapter extends ArrayAdapter {
private Context mCtx;
private int resource;
private ArrayList<ItemModel> items;
private ArrayList<ItemModel> tempItems;
private List<ItemModel> suggestions;
public AutoSuggestAdapter(Context mCtx, int resource, ArrayList<ItemModel> items) {
super(mCtx, resource, 0, items);
this.mCtx = mCtx;
this.resource = resource;
this.items = items;
tempItems = new ArrayList<>();
suggestions = new ArrayList<ItemModel>(items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) mCtx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(resource, parent, false);
}
ItemModel item = items.get(position);
if (item != null && view instanceof TextView) {
((TextView) view).setText((CharSequence) item);
}
return view;
}
@Override
public Filter getFilter() {
return itemFilter;
}
Filter itemFilter = new Filter() {
@Override
public CharSequence convertResultToString(Object resultValue) {
String str = (String) resultValue;
return str;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint != null) {
suggestions.clear();
for (ItemModel items : tempItems) {
if (items.toLowerCase().contains(constraint.toString().toLowerCase())) {
suggestions.add(items);
}
}
FilterResults filterResults = new FilterResults();
filterResults.values = suggestions;
filterResults.count = suggestions.size();
return filterResults;
} else {
return new FilterResults();
}
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
List<String> filterList = (ArrayList<String>) results.values;
if (results != null && results.count > 0) {
clear();
for (String item : filterList) {
add(item);
notifyDataSetChanged();
}
}
}
};
}
在 xml 中添加了 AutoCompleteTextView 作为
<AutoCompleteTextView
android:id="@+id/additemtobillname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:textColor="@color/colorAccent"
android:textSize="@dimen/textsize"
android:layout_marginLeft="20dp"
android:layout_toRightOf="@id/text2"
android:hint="Enter Item Name" />
在声明为的活动中
AutoCompleteTextView actv = findViewById(R.id.additemtobillname);
final ArrayList<ItemModel>[] itemlist = new ArrayList[]{new ArrayList<>()};
AutoSuggestAdapter adapter = new AutoSuggestAdapter(this, android.R.layout.simple_spinner_dropdown_item, itemlist[0]);
actv.setAdapter(adapter);
actv.setThreshold(1);
解决方案
您正在使用没有初始值的各种对象。
首先我看到的是tempItems ,它在使用performFiltering方法之前从未分配过值。
将项目的值分配给构造函数下的 tempItems
//tempItems = new ArrayList<>();
tempItems = items;
或者循环遍历 performFiltering 中的 items 对象而不是 tempItems 对象
for (ItemModel item : items) {
if (item.toLowerCase().contains(constraint.toString().toLowerCase())) {
suggestions.add(item);
}
}
此外,在调用itemlist[0]之前itemList是空的。这会引发运行时错误(ArrayOutOfBound)。
在引用其零索引之前,向数组对象添加至少一个值。
AutoCompleteTextView actv = findViewById(R.id.additemtobillname);
final ArrayList<ItemModel>[] itemlist = new ArrayList[]{new ArrayList<>()};
//add value
itemlist.add(new ArrayList<ItemModel>());
//pass use to adapter
AutoSuggestAdapter adapter = new AutoSuggestAdapter(this, android.R.layout.simple_spinner_dropdown_item, itemlist[0]);
actv.setAdapter(adapter);
actv.setThreshold(1);
推荐阅读
- javascript - HTML 测验 - JavaScript 按钮(将结果变为绿色,假红色)
- swift - 快速将字符串转换并格式化为字符数组
- swift - 删除 PencilKit 中的内容
- php - 如何扩展 laravel 刀片指令@extends?
- kubernetes-helm - helm push to artifactory 总是抛出 404 错误,找不到 /api/artifactory/helm/charts
- karate - 有没有办法从 karate-config.js 调用包含可重用功能文件路径的变量?
- powershell - Create table with different output
- java - 为什么我的方法不能使用 (String arg, arg2) 而不是 (String arg, String arg2)?
- javascript - 在带有 angular 的 fuse.js 中,我们在哪里传递搜索到的字符串和选项?
- python - 为枚举创建值查找列表