如何过滤带有EditText的RecyclerView

时间:2019-03-18 07:44:24

标签: android search filter android-recyclerview retrofit

我正在尝试使用EditText搜索RecylerView,我按照一些教程进行操作,并收到Error NullPointerException。我的RecyclerView运行良好,但是我的搜索程序无法运行。

这是我的适配器代码

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();
}
}

这是我的代码片段

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

但是方法getItemCount()的错误为null。请帮我解决这个问题

2 个答案:

答案 0 :(得分:0)

listFilter中分配的数据存在问题。 您正在通过以下方法在listDefood中添加数据

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

但是您没有在listFilter中添加列表。

您需要在Both数组中添加列表。

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

答案 1 :(得分:0)

分配过滤后的列表大小以过滤结果。

尝试

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;
        }
    };
}