【问题标题】:How to filter RecyclerView wih EditText如何使用 EditText 过滤 RecyclerView
【发布时间】:2019-08-08 12:58:54
【问题描述】:

我正在尝试使用 EditText 搜索 RecylerView,我按照一些教程进行操作,但出现错误 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。请帮我解决这个问题

【问题讨论】:

  • 使用Filterable 基本适配器,如this - 示例工作适配器是here - 与Filterable 类一样,过滤是通过调用adapter.getFilter().filter(...) 完成的
  • @AD10 是的,我按照该教程进行操作,但出现此错误
  • @pskink 对不起,我不明白你的例子

标签: android search filter android-recyclerview retrofit


【解决方案1】:

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

【讨论】:

  • 2019-03-18 15:05:08.658 23614-23614/com.example.zaki.delivreport E/AndroidRuntime:致命异常:主进程:com.example.zaki.delivreport,PID:23614 java.lang.NullPointerException:尝试在 com.example.zaki.delivreport.Adapter.ListDefoodAdapter.getItemCount(ListDefoodAdapter.java:131)
  • 你在 listFilter 中添加列表了吗?
  • 我已经更新了我的答案。你以前试过这个吗?
  • @VishrutMavani 是的,我有
【解决方案2】:

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

试试这个

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

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 2015-08-04
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多