recyclerview中的Searchview重复了数据

Searchview in recyclerview duplicates the data

在操作栏中实现了搜索视图,搜索工作正常,但是例如, 如果用户搜索两个字符 pa,我的列表包含 2 个与 pa 相关的数据,即 pack1、pack2 然后数据加载到回收器中看法。现在如果用户输入另一个字符 l 到前面的字符 pa,现在我的搜索视图有 pal ,但数组列表与搜索,该列表不包含任何带有 pal 的项目。即,现在回收站视图是空的。现在,如果我清除字符 l,列表会重新加载数据 pack1、pack2,但结果会加载 2 次,即,它不会在 recyclerview 中显示 2 个项目,而是总共显示 4 个项目. 当搜索被清除时,它正在复制项目。

搜索视图

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_order, menu);
        searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
        searchView.setMaxWidth(Integer.MAX_VALUE);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                mOrderAdapter.getFilter().filter(query);
                searchView.clearFocus();
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                if(newText.length()==0){
                    getData();
                    searchView.clearFocus();
                }
                mOrderAdapter.getFilter().filter(newText);
                return true ;
            }
        });
        return true;
    }

过滤代码

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                String charString = constraint.toString();
                if (charString.isEmpty()||charString.length()==0) {
                    mListFilter = mOrderArrayList;
                } else {
                    List<Order> filteredList = new ArrayList<>();
                    ArrayList<Order> templist=new ArrayList<Order>();
                    for (Order ord : mOrderArrayList) {
                        if (ord.getOs_OrderNo().toLowerCase().contains(charString.toLowerCase())
                                || ord.getItemName().toLowerCase().contains(charString.toLowerCase())) {
                            filteredList.add(ord);
                            templist.addAll(mListFilter);
                        }
                    }
                    mOrderArrayList.removeAll(templist);
                    mOrderArrayList.addAll(filteredList);
                    mListFilter = filteredList;
                }

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

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                mListFilter = (ArrayList<Order>) results.values;
                notifyDataSetChanged();
            }
        };
    }

非常感谢任何帮助。

适配器代码

public class OrderAdapter extends RecyclerView.Adapter<OrderAdapter.MyViewHolder> implements Filterable {

    private Context mContext;
    private List<Order> mListFilter,mOrderArrayList;
    private SharedPreferences sharedPreferences;
    private Resources r;


    public OrderAdapter(Context context, ArrayList<Order> orderList) {
        mContext = context;
        mListFilter = orderList;
        mOrderArrayList = orderList;
        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
        r = context.getResources();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView orderNoView, itemNameView, qtyView, statusView, companyNameView;
        private Order currentItem;

        MyViewHolder(View view) {
            super(view);
            orderNoView = view.findViewById(R.id.orderNo);
            itemNameView = view.findViewById(R.id.item);
            qtyView = view.findViewById(R.id.qty);
            statusView = view.findViewById(R.id.status);
            companyNameView = view.findViewById(R.id.company);

        }

        void bind (Order om) {  //<--bind method allows the ViewHolder to bind to the data it is displaying
            orderNoView.setText(om.getOs_OrderNo());
            itemNameView.setText(String.valueOf(om.getItemName()));
            qtyView.setText("Qty - " + String.valueOf(om.getOs_Qty()));
            statusView.setText(om.getStatusName());

            if (sharedPreferences.getString(r.getString(R.string.key_CompanyInUser), "").equals("0")){
                companyNameView.setVisibility(View.GONE);
            } else {
                companyNameView.setText(om.getCustomerName());
            }
            currentItem = om; //<-- keep a reference to the current item
        }
    }


    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.adapter_order, parent, false);
        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        Order item =  mListFilter.get(position);
        holder.bind(item);

    }

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


    @Override

    public int getItemViewType(int position){
        return  position;

    }
@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String charString = constraint.toString();
            List<Order> filteredList = new ArrayList<>();
            if (charString.isEmpty()||charString.length()==0) {
                filteredList.addAll(mOrderArrayList);
            } else {
                for (Order ord : mOrderArrayList) {
                    if (ord.getOs_OrderNo().toLowerCase().contains(charString.toLowerCase())
                            || ord.getItemName().toLowerCase().contains(charString.toLowerCase())) {
                        filteredList.add(ord);
                    }
                }
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = filteredList;
            return filterResults;
        }
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mListFilter = (ArrayList<Order>) results.values;
            notifyDataSetChanged();
        }
    };
}

}

Clicklistener 代码

  brandView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), brandView,
                new RecyclerTouchListener.ClickListener() {
                    @Override
                    public void onClick(View view, int position) {
                        isRefreshData = true;
                        startActivity(new Intent(mContext, ViewOrderDetails.class).putExtra("Key-Intent-OrderNo",mOrderArrayList.get(position).getOs_OrderNo()).putExtra("Key-Intent-BrandName",mOrderArrayList.get(position).getos_BrandName()));
                    }
                    @Override
                    public void onLongClick(View view, int position) {
                    }
                }));

这是因为您在 #performFiltering 的循环中使用了 addAll 。还有为什么你有两个用于过滤的本地列表?检查下面的方法应该有效。我已经删除了导致问题的额外代码和代码。

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            String charString = constraint.toString();
            List<Order> filteredList = new ArrayList<>();
            if (charString.isEmpty()||charString.length()==0) {
                filteredList.addAll(mOrderArrayList);
            } else {
                for (Order ord : mOrderArrayList) {
                    if (ord.getOs_OrderNo().toLowerCase().contains(charString.toLowerCase())
                            || ord.getItemName().toLowerCase().contains(charString.toLowerCase())) {
                        filteredList.add(ord);
                    }
                }
            }
            FilterResults filterResults = new FilterResults();
            filterResults.values = filteredList;
            return filterResults;
        }
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            mListFilter = (ArrayList<Order>) results.values;
            notifyDataSetChanged();
        }
    };
}