首页 > 解决方案 > 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);

标签: javaandroid

解决方案


您正在使用没有初始值的各种对象。

首先我看到的是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);

推荐阅读