【问题标题】:Android AutoComplete with custom filter having duplicate results带有重复结果的自定义过滤器的 Android AutoComplete
【发布时间】:2014-12-01 14:14:48
【问题描述】:

美好的一天,我已经实现了这个带有可过滤接口的自定义适配器,并且在结果列表中得到了重复的值。

SearchAutoCompleteAdapter.java

public class SearchAutoCompleteAdapter extends BaseAdapter implements Filterable {

    private ArrayList<BaseAutocompleteItems> resultList;
    List<BaseAutocompleteItems> filteredProducts;
    private LayoutInflater layoutInflater;
    private Context context;
    private int layout;
    SearchAutoCompleteAPI searchautocomplete = new SearchAutoCompleteAPI();

    public SearchAutoCompleteAdapter(Context context, int resource) {
        super();
        this.context = context;
        this.layout = resource;
        filteredProducts = new ArrayList<BaseAutocompleteItems>();
        resultList = new ArrayList<BaseAutocompleteItems>();
    }


    @Override
    public int getCount() {
        return resultList.size();
    }


    @Override
    public Object getItem(int index) {
        return resultList.get(index);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(layout, null);

        }

        TextView name = (TextView) convertView.findViewById(R.id.suggestion_text_id);

        name.setText(resultList.get(position).getName());


        return convertView;
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {


                FilterResults filterResults = new FilterResults();
                List<BaseAutocompleteItems> tempfilteredProducts = new ArrayList<BaseAutocompleteItems
                filteredProducts.clear();

                if (constraint != null || constraint.length() > 0) {
                    tempfilteredProducts.clear();

                    tempfilteredProducts = searchautocomplete.autocomplete(constraint.toString());  //webservice call
                } else {

                    tempfilteredProducts = new ArrayList<BaseAutocompleteItems>();

                }

                    for (BaseAutocompleteItems items : tempfilteredProducts) {

                        if (items.getName().contains(constraint.toString())) {

                            filteredProducts.add(items);
                             }
                        }

                        filterResults.values = filteredProducts;
                        filterResults.count = filteredProducts.size();

                    return filterResults;
                }

                @Override
                protected void publishResults (CharSequence constraint, FilterResults results){

                    resultList = (ArrayList<BaseAutocompleteItems>)results.values;
                    if(results.count > 0)  {

                        notifyDataSetChanged();
                    } else {

                        notifyDataSetInvalidated();
                    }
                }
            }

            ;
            return filter;
        }

    }

如果我键入“yell”并按退格键输入“yel”或将字符增加到“yello”,我会得到相同的结果,因此 ArrayList 最终会出现重复的项目。我尝试在填充列表之前清除列表,但似乎没有任何效果。

【问题讨论】:

  • 不应该是if (constraint != null || constraint.length() != 0)吗?
  • @user87049 拼写错误应该是 constraint.lenght() > 0.. 仍然有同样的问题。

标签: android autocompletetextview android-filterable


【解决方案1】:

问题中的代码没有问题。只是给任何人的清单。确保在行中返回的 ArrayList 上调用 Clear()。

tempfilteredProducts = searchautocomplete.autocomplete(constraint.toString());  //webservice call

首先来自 API 调用,然后从 web 服务填充值并将其发送回 tempfilteredProducts(即在每个 api 请求之前)。这样,您可以避免 autocompletetextview 字符串中的重复值,就像我在问题中的情况一样。

【讨论】:

    【解决方案2】:

    尝试改变

    if (items.getName().contains(constraint.toString()))
    

    if (items.getName().startsWith(constraint.toString()))
    

    【讨论】:

    • 我已经尝试过,但我仍然遇到同样的问题。
    猜你喜欢
    • 2012-01-05
    • 2014-09-06
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多