Android 带有RecyclerView的SearchView过滤器

Android 带有RecyclerView的SearchView过滤器,android,adapter,searchview,android-recyclerview,Android,Adapter,Searchview,Android Recyclerview,我曾尝试在片段中实现带有建议(过滤器)的SearchView,但我没有管理它。我几乎尝试了每一个教程,但没有一个对我有用。我将感谢任何帮助。多谢各位 XML 适配器 public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ContactVH> { List<Contact> mContact; List<Contact> mContactFilter

我曾尝试在片段中实现带有建议(过滤器)的SearchView,但我没有管理它。我几乎尝试了每一个教程,但没有一个对我有用。我将感谢任何帮助。多谢各位

XML

适配器

public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ContactVH> {

    List<Contact> mContact;
    List<Contact> mContactFilter;

    Context mContext;

    public ContactsAdapter(Context context, List<Contact> contact) {
        this.mContact = contact;
        this.mContext = context;
    }

    @Override
    public ContactVH onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_contact, parent, false);
        ContactVH viewHolder = new ContactVH(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ContactVH holder, int position) {
        holder.name.setText(mContact.get(position).getName());
    }

    @Override
    public int getItemCount() {
        return mContact.size();
    }

    class ContactVH extends RecyclerView.ViewHolder {
        @BindView(R.id.contact_name)
        TextView name;

        public ContactVH(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }

    }

}
公共类ContactsAdapter扩展了RecyclerView.Adapter{
列表mContact;
列表mContactFilter;
语境;
公共联系人适配器(上下文、列表联系人){
this.mContact=联系人;
this.mContext=上下文;
}
@凌驾
公共联系人vh onCreateViewHolder(视图组父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.row\u item\u contact,parent,false);
ContactVH viewHolder=新ContactVH(视图);
返回视图持有者;
}
@凌驾
BindViewHolder上的公共无效(ContactVH holder,内部位置){
holder.name.setText(mContact.get(position.getName());
}
@凌驾
public int getItemCount(){
返回mContact.size();
}
类别ContactVH扩展了RecyclerView.ViewHolder{
@BindView(R.id.contact_name)
文本视图名称;
公共联系人VH(查看项目视图){
超级(项目视图);
ButterKnife.bind(这个,itemView);
}
}
}

您可以创建扩展过滤器的类

class YourFilterClass extends Filter {

private List<Contact> contactList;
private List<Contact> filteredContactList;
private ContactsAdapter adapter;

    public YourFilterClass(List<Contact> contactList, ContactsAdapter adapter) {
     this.adapter = adapter;
     this.contactList = contactList;
     this.filteredContactList = new ArrayList();
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
    filteredContactList.clear();
    final FilterResults results = new FilterResults();

    //here you need to add proper items do filteredContactList
     for (final Contact item : contactList) {
            if (item.getName().toLowerCase().trim().contains("pattern")) { 
                filteredContactList.add(item);
            }
        }

        results.values = filteredContactList;
        results.count = filteredContactList.size();
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        adapter.setList(filteredContactList);
        adapter.notifyDataSetChanged();
    }
class YourFilterClass扩展过滤器{
私人名单联系人名单;
私有列表筛选联系人列表;
专用接触器适配器;
public YourFilterClass(列出联系人列表、联系人适配器){
this.adapter=适配器;
this.contactList=联系人列表;
this.filteredContactList=新的ArrayList();
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
filteredContactList.clear();
最终FilterResults结果=新的FilterResults();
//在这里,您需要添加适当的项目do filteredContactList
用于(最终联系人项目:联系人列表){
如果(item.getName().toLowerCase().trim()包含(“模式”){
filteredContactList.add(项目);
}
}
results.values=filteredContactList;
results.count=filteredContactList.size();
返回结果;
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
adapter.setList(filteredContactList);
adapter.notifyDataSetChanged();
}
}

然后您可以将此过滤器添加到您的联系人适配器中

public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ContactVH> {

List<Contact> mContact;
List<Contact> mContactFilter;
YourFilterClass filter;

Context mContext;

public ContactsAdapter(Context context, List<Contact> contact) {
    this.mContact = contact;
    this.mContactFilter = contact;
    this.mContext = context;
    filter = new YourFilterClass(mContact, this);
}

@Override
public ContactVH onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_contact, parent, false);
    ContactVH viewHolder = new ContactVH(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(ContactVH holder, int position) {
    holder.name.setText(mContactFilter.get(position).getName());
}
// set adapter filtered list
public void setList(List<Contact> list) {
    this.mContactFilter = list;
}
//call when you want to filter
public void filterList(String text) {
    filter.filter(text);
}

@Override
public int getItemCount() {
    return mContactFilter.size();
}

class ContactVH extends RecyclerView.ViewHolder {
    @BindView(R.id.contact_name)
    TextView name;

    public ContactVH(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }

}
公共类ContactsAdapter扩展了RecyclerView.Adapter{
列表mContact;
列表mContactFilter;
你的过滤器类过滤器;
语境;
公共联系人适配器(上下文、列表联系人){
this.mContact=联系人;
this.mContactFilter=触点;
this.mContext=上下文;
过滤器=新的过滤器类(mContact,this);
}
@凌驾
公共联系人vh onCreateViewHolder(视图组父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.row\u item\u contact,parent,false);
ContactVH viewHolder=新ContactVH(视图);
返回视图持有者;
}
@凌驾
BindViewHolder上的公共无效(ContactVH holder,内部位置){
holder.name.setText(mContactFilter.get(position.getName());
}
//设置适配器筛选列表
公共无效集合列表(列表){
this.mContactFilter=列表;
}
//需要筛选时请致电
公共空过滤器列表(字符串文本){
过滤器。过滤器(文本);
}
@凌驾
public int getItemCount(){
返回mContactFilter.size();
}
类别ContactVH扩展了RecyclerView.ViewHolder{
@BindView(R.id.contact_name)
文本视图名称;
公共联系人VH(查看项目视图){
超级(项目视图);
ButterKnife.bind(这个,itemView);
}
}
}试试这个

为适配器类实现可筛选功能

公共类CategoryAdapter扩展了RecyclerView。适配器实现可筛选{

private List<Category> categoryList;
private List<Category> mFilteredList;


public CategoryAdapter(List<Category> categoryList) {

    this.categoryList = categoryList;
    this.mFilteredList = categoryList;
}

@Override
public CategoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.category_card, parent, false);

    return new CategoryViewHolder(itemView);
}

@Override
public void onBindViewHolder(CategoryViewHolder holder, int position) {
        Category category = mFilteredList.get(position);
        holder.catname.setText(category.getCatName());
        holder.items.setText(category.getCatItems()+" Items");


}

@Override
public int getItemCount() {
    return mFilteredList.size();
}

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

            String charString = charSequence.toString();
            if (charString.isEmpty()) {

                mFilteredList = categoryList;
            } else {

                List<Category> filteredList = new ArrayList<>();

                for (Category category : categoryList) {

                    if (category.getCatName().toLowerCase().contains(charString) || String.valueOf(category.getId()).contains(charString)) {

                        filteredList.add(category);
                    }
                }

                mFilteredList = filteredList;
            }

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

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

public class CategoryViewHolder extends RecyclerView.ViewHolder {
    public TextView catname, items;
    public ImageView imgView;

    public CategoryViewHolder(View view) {
        super(view);
        catname = view.findViewById(R.id.categorycard_cate_name);
        items = view.findViewById(R.id.categorycard_lbl_cat_items);

    }
}

public void removeItem(int position) {
    mFilteredList.remove(position);
    // notify the item removed by position
    // to perform recycler view delete animations
    // NOTE: don't call notifyDataSetChanged()
    notifyItemRemoved(position);
}

public void restoreItem(Category category, int position) {
    mFilteredList.add(position, category);
    // notify item added by position
    notifyItemInserted(position);
}
私有列表分类列表;
私人名单;
公共类别适配器(列表类别列表){
this.categoryList=categoryList;
this.mFilteredList=类别列表;
}
@凌驾
公共类别ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.category_卡、母卡、假卡);
返回新的CategoryView文件夹(itemView);
}
@凌驾
BindViewHolder上的公共无效(类别ViewHolder,内部位置){
Category Category=mFilteredList.get(位置);
holder.catname.setText(category.getCatName());
holder.items.setText(category.getCatItems()+“items”);
}
@凌驾
public int getItemCount(){
返回mFilteredList.size();
}
@凌驾
公共过滤器getFilter(){
返回新筛选器(){
@凌驾
受保护过滤器结果执行过滤(CharSequence CharSequence){
String charString=charSequence.toString();
if(charString.isEmpty()){
mFilteredList=类别列表;
}否则{
List filteredList=新建ArrayList();
用于(类别:类别列表){
if(category.getCatName().toLowerCase().contains(charString)| | String.valueOf(category.getId()).contains(charString)){
filteredList.add(类别);
}
}
mFilteredList=filteredList;
}
FilterResults FilterResults=新的FilterResults();
filterResults.values=mFilteredList;
返回过滤器结果;
}
@凌驾
受保护的无效发布结果(CharSequence CharSequence、FilterResults FilterResults){
mFilteredList=(列表)filterResults.values;
notifyDataSetChanged();
}
};
}
公共类CategoryViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图catname、项目;
公共图像视图im
public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ContactVH> {

List<Contact> mContact;
List<Contact> mContactFilter;
YourFilterClass filter;

Context mContext;

public ContactsAdapter(Context context, List<Contact> contact) {
    this.mContact = contact;
    this.mContactFilter = contact;
    this.mContext = context;
    filter = new YourFilterClass(mContact, this);
}

@Override
public ContactVH onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_contact, parent, false);
    ContactVH viewHolder = new ContactVH(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(ContactVH holder, int position) {
    holder.name.setText(mContactFilter.get(position).getName());
}
// set adapter filtered list
public void setList(List<Contact> list) {
    this.mContactFilter = list;
}
//call when you want to filter
public void filterList(String text) {
    filter.filter(text);
}

@Override
public int getItemCount() {
    return mContactFilter.size();
}

class ContactVH extends RecyclerView.ViewHolder {
    @BindView(R.id.contact_name)
    TextView name;

    public ContactVH(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }

}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    inflater.inflate(R.menu.main_menu, menu);

    MenuItem mSearchMenuItem = menu.findItem(R.id.search);
    SearchView searchView = (SearchView) mSearchMenuItem.getActionView();

    search(searchView);
}

public static void search(android.support.v7.widget.SearchView searchView) {

    searchView.setOnQueryTextListener(new android.support.v7.widget.SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {

            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            mCategoryAdapter.getFilter().filter(newText);
            return true;
        }
    });
}
private List<Category> categoryList;
private List<Category> mFilteredList;


public CategoryAdapter(List<Category> categoryList) {

    this.categoryList = categoryList;
    this.mFilteredList = categoryList;
}

@Override
public CategoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.category_card, parent, false);

    return new CategoryViewHolder(itemView);
}

@Override
public void onBindViewHolder(CategoryViewHolder holder, int position) {
        Category category = mFilteredList.get(position);
        holder.catname.setText(category.getCatName());
        holder.items.setText(category.getCatItems()+" Items");


}

@Override
public int getItemCount() {
    return mFilteredList.size();
}

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

            String charString = charSequence.toString();
            if (charString.isEmpty()) {

                mFilteredList = categoryList;
            } else {

                List<Category> filteredList = new ArrayList<>();

                for (Category category : categoryList) {

                    if (category.getCatName().toLowerCase().contains(charString) || String.valueOf(category.getId()).contains(charString)) {

                        filteredList.add(category);
                    }
                }

                mFilteredList = filteredList;
            }

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

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

public class CategoryViewHolder extends RecyclerView.ViewHolder {
    public TextView catname, items;
    public ImageView imgView;

    public CategoryViewHolder(View view) {
        super(view);
        catname = view.findViewById(R.id.categorycard_cate_name);
        items = view.findViewById(R.id.categorycard_lbl_cat_items);

    }
}

public void removeItem(int position) {
    mFilteredList.remove(position);
    // notify the item removed by position
    // to perform recycler view delete animations
    // NOTE: don't call notifyDataSetChanged()
    notifyItemRemoved(position);
}

public void restoreItem(Category category, int position) {
    mFilteredList.add(position, category);
    // notify item added by position
    notifyItemInserted(position);
}
    @Override
public Filter getFilter() {

    Filter filter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            FilterResults filterResults = new FilterResults();

            if(charSequence == null | charSequence.length() == 0){
                filterResults.count = getUserModelListFiltered.size();
                filterResults.values = getUserModelListFiltered;

            }else{
                String searchChr = charSequence.toString().toLowerCase();

                List<UserModel> resultData = new ArrayList<>();

                for(UserModel userModel: getUserModelListFiltered){
                    if(userModel.getUserName().toLowerCase().contains(searchChr)){
                        resultData.add(userModel);
                    }
                }
                filterResults.count = resultData.size();
                filterResults.values = resultData;

            }

            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {

            userModelList = (List<UserModel>) filterResults.values;
            notifyDataSetChanged();

        }
    };
    return filter;
}
 @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);

    MenuItem menuItem = menu.findItem(R.id.search_view);

    SearchView searchView = (SearchView) menuItem.getActionView();

    searchView.setMaxWidth(Integer.MAX_VALUE);

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {

            usersAdapter.getFilter().filter(newText);
            return true;
        }
    });



    return  true;
}
SearchView addCustomerPageSearchView = findViewById(R.id.addCustomerPageSearchView);
    addCustomerPageSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {

            searchResult(query);

            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {

            searchResult(newText);

            return true;
        }
    });


    private void searchResult(String query)
    {
    String q = query.toLowerCase();
    List<ModelContacts> updatedList = new ArrayList<>();

    for (ModelContacts modelContacts : contactList)
    {
        if(modelContacts.getName().toLowerCase().contains(q))
        {
            updatedList.add(modelContacts);
        }
    }

    adapter = new ContactAdapter(getApplicationContext(), updatedList);
    contactListRecycler.setAdapter(adapter);
}