简体   繁体   English

如何过滤带有EditText的RecyclerView

[英]How to filter RecyclerView wih EditText

I am trying to search a RecylerView with EditText, i follow some tutorial and i get Error NullPointerException. 我正在尝试使用EditText搜索RecylerView ,我按照一些教程进行操作,并且收到Error NullPointerException。 my RecyclerView is working good , but my search program is not working. 我的RecyclerView运行良好,但是我的搜索程序无法运行。

this is my Adapter Code 这是我的适配器代码

public class ListDefoodAdapter extends RecyclerView.Adapter<ListDefoodAdapter.CategoryViewHolder> implements Filterable {

private Context context;
private ArrayList<DefoodListData> listDefood;
private ArrayList<DefoodListData> listFilter;

public ListDefoodAdapter(Context context) {
    this.context = context;
}

public ArrayList<DefoodListData> getListDefood() {
    return listDefood;
}

public void setListDefood(ArrayList<DefoodListData> listDefood) {
    this.listDefood = listDefood;
}

@NonNull
@Override
public CategoryViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View itemRow = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_transaksidefood, viewGroup, false);
    return new CategoryViewHolder(itemRow);
}

public Filter getFilter(){
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String charString = constraint.toString();

            if (charString.isEmpty()){
                listDefood = listFilter;
            } else {
                ArrayList<DefoodListData> filteredList = new ArrayList<>();
                for (DefoodListData row : listFilter){
                    String id = String.valueOf(row.getId());
                    if (id.toLowerCase().contains(charString.toLowerCase()) ||
                            row.getNamaUser().toLowerCase().contains(charString.toLowerCase()) ||
                            row.getNamaDriver().toLowerCase().contains(charString.toLowerCase())){
                        filteredList.add(row);
                    }
                }
                listDefood = filteredList;
            }

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

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            listDefood = (ArrayList<DefoodListData>) results.values;
            notifyDataSetChanged();
        }
    };
}

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

and this is my code in fragment 这是我的代码片段

private void searchData(){
    btn_search.setOnClickListener(v -> {
        String keySearch = edt_cari.getText().toString();
        listDefoodAdapter.getFilter().filter(keySearch);
    });
}

but i get error null on method getItemCount() . 但是我在方法getItemCount()上得到错误null。 Please help me to solve this problem 请帮我解决这个问题

there is an issue in your data assign in listFilter . listFilter分配数据时出现问题。 you are adding data in listDefood in below method 您正在通过以下方法在listDefood中添加数据

public void setListDefood(ArrayList<DefoodListData> listDefood) {
    this.listDefood = listDefood;
}

but you are not adding a list in listFilter . 但是您没有在listFilter添加列表。

You need to add list in Both array. 您需要在Both数组中添加列表。

public void setListDefood(ArrayList<DefoodListData> listDefood) {
    this.listDefood = listDefood;
    this.listFilter = listDefood;
}

Assign filtered list size to filter result. 分配过滤列表大小以过滤结果。

try with this 试试这个

public void setListDefood(ArrayList<DefoodListData> listDefood) {
    this.listDefood = listDefood;
    this.listFilter = listDefood;
}

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            listDefood = (List<DefoodListData >) results.values;
            notifyDataSetChanged();
        }
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String charString = constraint.toString().toLowerCase();
                FilterResults results = new FilterResults();
                ArrayList<DefoodListData> filteredList = new ArrayList<>();
                for (DefoodListData row : listFilter) {
                    if (String.valueOf(row.getId().toLowerCase().trim().contains(charString)) ||
                            row.getNamaUser().toLowerCase().trim().contains(charString) ||
                            row.getNamaDriver().toLowerCase().trim().contains(charString)) {
                        filteredList.add(row);
                    }
                }
                results.count = filteredList.size();
                results.values = filteredList;
                return results;
        }
    };
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM