【问题标题】:Using Spinner To Filter Custom ArrayList in RecyclerView is clearing entire list在 RecyclerView 中使用 Spinner 过滤自定义 ArrayList 正在清除整个列表
【发布时间】:2020-11-24 00:34:09
【问题描述】:

我正在尝试根据直径过滤项目列表。直径位于作为自定义对象元素的产品名称字符串中。到目前为止,当我从微调器中选择一个直径时,它正在清除列表中的每个项目。

微调逻辑

 //Spinner
        diameterSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                Object diameterFilter = spinnerAdapter.getItem(position);
                dAdapter.getFilter().filter(diameterFilter.toString());
                dAdapter.notifyDataSetChanged();
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

适配器上的过滤代码


    //FILTER
    @Override
    public Filter getFilter() {
        return displayFilter;
    }

    private Filter displayFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<Inventory> filteredList = new ArrayList<>();

            if (constraint == null || constraint.length() == 0){
                filteredList.addAll(displayedListFull);
            }else {
                String filterPattern = constraint.toString().toLowerCase().trim();


                for (Inventory item : displayedListFull){
                    if (item.getProductName().toLowerCase().contains(filterPattern)){
                        filteredList.add(item);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = filteredList;
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            displayedList.clear();
            displayedList.addAll((List)results.values);
            notifyDataSetChanged();
        }
    };

【问题讨论】:

    标签: java android android-recyclerview android-spinner


    【解决方案1】:

    在微调器回调中将getItem 更改为getItemAtPosition

    diameterSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            Object diameterFilter = spinnerAdapter.getItemAtPosition(position); // here is the change
            dAdapter.getFilter().filter(diameterFilter.toString());
            dAdapter.notifyDataSetChanged();
        }
    
    // rest of your code
    

    【讨论】:

    • getItemAtPosition 不是 spinnerAdapter 上的选项。我需要解决什么问题才能允许这样做?
    • 您是否有自定义微调器适配器或ArrayAdapter
    • 我正在使用 ArrayAdapter
    • 您确定diameterFilter.toString() 会返回预期值吗?
    • 我设置了一个自定义适配器并将 Log.d 放在 diameterFilter 上,以确保字符串是预期的。过滤后,我仍然会清除列表。这个确切的过滤器逻辑适用于搜索视图,但由于某种原因不适用于我的微调器。
    猜你喜欢
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2022-11-09
    • 2016-10-31
    • 1970-01-01
    相关资源
    最近更新 更多