首页 > 解决方案 > 允许对 Android SearchView 进行数字和文本过滤

问题描述

如何允许用户使用文本和数字过滤他们的联系人列表?这样用户就可以根据他们的姓名和电话号码来搜索联系人。

为了清楚起见,在我当前的代码下方:

@Override
    public void onCreateOptionsMenu(final Menu menu, MenuInflater inflater) {
        menu.clear(); // clears all menu items..
        inflater.inflate(R.menu.options_menu_contacts, menu);

        final MenuItem searchMenuItem = menu.findItem(R.id.search); // search option

        SearchView mSearchView = (SearchView) searchMenuItem.getActionView();
        // Set the filtering listener
        mSearchView.setOnQueryTextListener(
                new SearchView.OnQueryTextListener() {
                    @Override
                    public boolean onQueryTextSubmit(String query) {
                        return false;
                    }

                    @Override
                    public boolean onQueryTextChange(String newText) {
                        adapter.getFilter().filter(newText);
                        return false;
                    }
                });

        // TODO - hide the user card onSearch

        // Needed to close the SearchView when pressing back (instead of just losing focus)
        mSearchView.setOnQueryTextFocusChangeListener(
                (v, hasFocus) -> {
                    // TODO - on focus change, show/hide user's card
                    if (!hasFocus) {
                        adapter.isSearchMode = false;
                        searchMenuItem.collapseActionView();
                        adapter.notifyDataSetChanged();
                    } else {
                        adapter.isSearchMode = true;
                        searchMenuItem.collapseActionView();
                        adapter.notifyDataSetChanged();
                    }
                });

        super.onCreateOptionsMenu(menu, inflater);
    }

标签: javaandroidfiltersearchview

解决方案


您可以同时查询号码和联系人姓名。

在您的适配器中:

public class Adapter extends RecyclerView.Adapter<Viewholder> implements Filterable {
    private ArrayList<Contacts> contactArrayList = new ArrayList<>();
    private ArrayList<Contacts> mFilteredList = new ArrayList<>();
    private Context context;

    ...
    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {

                String charString = charSequence.toString();

                if (charString.isEmpty()) {

                    mFilteredList = contactArrayList;
                } else {
                    ArrayList<Contacts> filteredList = new ArrayList<>();

                    for (Contacts contact : contactArrayList) {
                        if (contact.getNumber().toLowerCase().contains(charString.toLowerCase()) || events.getName().toLowerCase().contains(charString.toLowerCase())) {

                            filteredList.add(contact);
                        }
                    }

                    mFilteredList = filteredList;
                }

                FilterResults filterResults = new FilterResults();
                filterResults.values = mFilteredList;
                return filterResults;
            }

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                mFilteredList = (ArrayList<Contacts>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }
}


推荐阅读