【问题标题】:AutoCompleteTextView with Custom Adapter filtering not working带有自定义适配器过滤的 AutoCompleteTextView 不起作用
【发布时间】:2017-10-31 11:41:12
【问题描述】:

我的 android 项目中有一个 autocomplete text view,它工作正常,但只有在其中输入第一个值时才有效。因此,为了使其更具可定制性,我添加了以下类

public class CustomArrayAdapterWIthFilter extends ArrayAdapter<String> implements Filterable {
List<String> items = null;
List<String> originalItems = null;
private MyFilters myFilters = null;
Context mContext;

public CustomArrayAdapterWIthFilter(@NonNull Context context, @LayoutRes int resource, @NonNull List<String> objects) {
    super(context, resource, objects);
    this.items = new ArrayList<>();
    items.addAll(objects);
    this.originalItems = new ArrayList<>();
    this.originalItems.addAll(objects);
    mContext = context;
}

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

@Nullable
@Override
public String getItem(int position) {
    return items.get(position);
}

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

@Override
public void notifyDataSetChanged() {
    super.notifyDataSetChanged();
}

@NonNull
@Override
public Filter getFilter() {
    if (myFilters == null) {
        myFilters = new MyFilters();
    }
    return myFilters;
}

class MyFilters extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults result = new FilterResults();

        if (constraint != null && constraint.toString().length() > 0) {
            ArrayList<String> filteredItems = new ArrayList<String>();

            for (int i = 0, l = originalItems.size(); i < l; i++) {
                String item = originalItems.get(i);
                if (item.toString().toLowerCase().contains(constraint))
                    filteredItems.add(item);
            }
            result.count = filteredItems.size();
            result.values = filteredItems;
        } else {
            synchronized (this) {
                result.values = originalItems;
                result.count = originalItems.size();
            }
        }
        return result;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        items = (ArrayList<String>) results.values;
        notifyDataSetChanged();
        clear();
        for (int i = 0, l = items.size(); i < l; i++)
            add(items.get(i));
        notifyDataSetInvalidated();
    }
}

public void addItems(List<String> items) {
    this.items = items;
    notifyDataSetChanged();
}

在我的片段中,我完成了以下操作

CustomArrayAdapterWIthFilter meterSrNumAdapter;
 if (meterSrNumAdapter.getCount() == 0) {
            meterSrArrayList = new MeterManager(getActivity()).getRefNoByStatus(Constants.SR_NO_UN_USED);
            meterSrArrayList.add(installationDetails.getMsn());
            meterSrNumAdapter.addItems(meterSrArrayList);
        }
 if (meterSrNumAdapter.getCount() == 0) {
            meterSrArrayList = new MeterManager(getActivity()).getRefNoByStatus(Constants.SR_NO_UN_USED);
            meterSrNumAdapter.addItems(meterSrArrayList);
        }

meterSrArrayList = new ArrayList<String>();
    meterSrNumAdapter = new CustomArrayAdapterWIthFilter(getActivity(), R.layout.custom_spinner_layout, meterSrArrayList);
    smartMsnSpinner.setAdapter(meterSrNumAdapter);
    smartMsnSpinner.setSingleLine(true);
    smartMsnSpinner.setThreshold(1);

    smartMsnSpinner.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
           selectedMeterNo = adapterView.getItemAtPosition(i).toString();
            Log.d("testtt", adapterView.getItemAtPosition(i).toString());
        }


    });

在上面的代码中smartMsnSpinner 是我的自动完成文本视图

当我运行我的应用程序时,自动完成功能不起作用。我尝试了一些其他放置在互联网上的适配器。但结果还是一样。我正在尝试这个自定义适配器,因为在我的另一个应用程序中它运行良好,而在这段代码中我也在做同样的事情。

更新 1

根据建议我更改了自定义适配器代码,同时考虑到代码的其他部分与上面添加的相同

List<String> suggestionItems = null;

//In constructor
this.items = new ArrayList<>(objects);

this.originalItems = new ArrayList<>(objects);

mContext = context;

class MyFilters extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

        if(constraint !=null)
        {
            suggestionItems.clear();

            for(int i=0, i1 = originalItems.size(); i <i1; i++)
            {
                String item = originalItems.get(i);
                if(item.toString().toLowerCase().contains(constraint))
                    suggestionItems.add(item);
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = suggestionItems;
            filterResults.count = suggestionItems.size();
            return filterResults;
        }
        else
        {
            return new FilterResults();
        }

    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
         if(results !=null && results.count > 0)
         {
             items.clear();
             items = (ArrayList<String>)results.values;
             notifyDataSetChanged();
         }
         else
         {
             items.addAll(originalItems);
         }
    }
}

任何帮助将不胜感激。

【问题讨论】:

    标签: android android-arrayadapter autocompletetextview custom-adapter android-filterable


    【解决方案1】:

    在 Constructor 中不需要使用 add all ,您可以像这样分配并在适配器中再创建一个,

    List<String> suggestionItems = null;
    
    //constructor should be like this 
    
    this.items = new ArrayList<>(objects);
    this.originalItems = new ArrayList<>(objects);
    this.suggestionItems = new ArrayList<>();
    

    过滤器应该是

    class MyFilters extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            if (constraint != null)
            {
                suggestionItems .clear();
                for (int i = 0, l = originalItems.size(); i < l; i++) {
                    String item = originalItems.get(i);
                    if (item.toString().toLowerCase().contains(constraint))
                        suggestionItems .add(item);
                }
                FilterResults filterResults = new FilterResults();
                filterResults.values = suggestionItems ;
                filterResults.count = suggestionItems .size();
                return filterResults;
            }
            else
            {
                return new FilterResults();
            }
        }
    
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            if (results != null && results.count > 0) {
                items.clear();
                items = (ArrayList<String>) results.values;
                notifyDataSetChanged();
            }
            else {
                items .addAll(originalItems );
            }
        }
    }
    

    【讨论】:

    • constraint 为空
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多