searchview复制数据

sh7euo9m  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(340)

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

  1. @Override
  2. public boolean onCreateOptionsMenu(Menu menu) {
  3. getMenuInflater().inflate(R.menu.menu_order, menu);
  4. searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
  5. searchView.setImeOptions(EditorInfo.IME_ACTION_DONE);
  6. searchView.setMaxWidth(Integer.MAX_VALUE);
  7. searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
  8. @Override
  9. public boolean onQueryTextSubmit(String query) {
  10. mOrderAdapter.getFilter().filter(query);
  11. searchView.clearFocus();
  12. return true;
  13. }
  14. @Override
  15. public boolean onQueryTextChange(String newText) {
  16. if(newText.length()==0){
  17. getData();
  18. searchView.clearFocus();
  19. }
  20. mOrderAdapter.getFilter().filter(newText);
  21. return true ;
  22. }
  23. });
  24. return true;
  25. }

过滤代码

  1. @Override
  2. public Filter getFilter() {
  3. return new Filter() {
  4. @Override
  5. protected FilterResults performFiltering(CharSequence constraint) {
  6. String charString = constraint.toString();
  7. if (charString.isEmpty()||charString.length()==0) {
  8. mListFilter = mOrderArrayList;
  9. } else {
  10. List<Order> filteredList = new ArrayList<>();
  11. ArrayList<Order> templist=new ArrayList<Order>();
  12. for (Order ord : mOrderArrayList) {
  13. if (ord.getOs_OrderNo().toLowerCase().contains(charString.toLowerCase())
  14. || ord.getItemName().toLowerCase().contains(charString.toLowerCase())) {
  15. filteredList.add(ord);
  16. templist.addAll(mListFilter);
  17. }
  18. }
  19. mOrderArrayList.removeAll(templist);
  20. mOrderArrayList.addAll(filteredList);
  21. mListFilter = filteredList;
  22. }
  23. FilterResults filterResults = new FilterResults();
  24. filterResults.values = mListFilter;
  25. return filterResults;
  26. }
  27. @Override
  28. protected void publishResults(CharSequence constraint, FilterResults results) {
  29. mListFilter = (ArrayList<Order>) results.values;
  30. notifyDataSetChanged();
  31. }
  32. };
  33. }

非常感谢您的帮助。
适配器代码

  1. public class OrderAdapter extends RecyclerView.Adapter<OrderAdapter.MyViewHolder> implements Filterable {
  2. private Context mContext;
  3. private List<Order> mListFilter,mOrderArrayList;
  4. private SharedPreferences sharedPreferences;
  5. private Resources r;
  6. public OrderAdapter(Context context, ArrayList<Order> orderList) {
  7. mContext = context;
  8. mListFilter = orderList;
  9. mOrderArrayList = orderList;
  10. sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
  11. r = context.getResources();
  12. }
  13. class MyViewHolder extends RecyclerView.ViewHolder {
  14. private TextView orderNoView, itemNameView, qtyView, statusView, companyNameView;
  15. private Order currentItem;
  16. MyViewHolder(View view) {
  17. super(view);
  18. orderNoView = view.findViewById(R.id.orderNo);
  19. itemNameView = view.findViewById(R.id.item);
  20. qtyView = view.findViewById(R.id.qty);
  21. statusView = view.findViewById(R.id.status);
  22. companyNameView = view.findViewById(R.id.company);
  23. }
  24. void bind (Order om) { //<--bind method allows the ViewHolder to bind to the data it is displaying
  25. orderNoView.setText(om.getOs_OrderNo());
  26. itemNameView.setText(String.valueOf(om.getItemName()));
  27. qtyView.setText("Qty - " + String.valueOf(om.getOs_Qty()));
  28. statusView.setText(om.getStatusName());
  29. if (sharedPreferences.getString(r.getString(R.string.key_CompanyInUser), "").equals("0")){
  30. companyNameView.setVisibility(View.GONE);
  31. } else {
  32. companyNameView.setText(om.getCustomerName());
  33. }
  34. currentItem = om; //<-- keep a reference to the current item
  35. }
  36. }
  37. @NonNull
  38. @Override
  39. public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  40. View itemView = LayoutInflater.from(parent.getContext())
  41. .inflate(R.layout.adapter_order, parent, false);
  42. return new MyViewHolder(itemView);
  43. }
  44. @Override
  45. public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
  46. Order item = mListFilter.get(position);
  47. holder.bind(item);
  48. }
  49. @Override
  50. public int getItemCount() {
  51. return mListFilter.size();
  52. }
  53. @Override
  54. public int getItemViewType(int position){
  55. return position;
  56. }
  57. @Override
  58. public Filter getFilter() {
  59. return new Filter() {
  60. @Override
  61. protected FilterResults performFiltering(CharSequence constraint) {
  62. String charString = constraint.toString();
  63. List<Order> filteredList = new ArrayList<>();
  64. if (charString.isEmpty()||charString.length()==0) {
  65. filteredList.addAll(mOrderArrayList);
  66. } else {
  67. for (Order ord : mOrderArrayList) {
  68. if (ord.getOs_OrderNo().toLowerCase().contains(charString.toLowerCase())
  69. || ord.getItemName().toLowerCase().contains(charString.toLowerCase())) {
  70. filteredList.add(ord);
  71. }
  72. }
  73. }
  74. FilterResults filterResults = new FilterResults();
  75. filterResults.values = filteredList;
  76. return filterResults;
  77. }
  78. @Override
  79. protected void publishResults(CharSequence constraint, FilterResults results) {
  80. mListFilter = (ArrayList<Order>) results.values;
  81. notifyDataSetChanged();
  82. }
  83. };
  84. }
  85. }

单击侦听器代码

  1. brandView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), brandView,
  2. new RecyclerTouchListener.ClickListener() {
  3. @Override
  4. public void onClick(View view, int position) {
  5. isRefreshData = true;
  6. startActivity(new Intent(mContext, ViewOrderDetails.class).putExtra("Key-Intent-OrderNo",mOrderArrayList.get(position).getOs_OrderNo()).putExtra("Key-Intent-BrandName",mOrderArrayList.get(position).getos_BrandName()));
  7. }
  8. @Override
  9. public void onLongClick(View view, int position) {
  10. }
  11. }));
sqyvllje

sqyvllje1#

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

  1. @Override
  2. public Filter getFilter() {
  3. return new Filter() {
  4. @Override
  5. protected FilterResults performFiltering(CharSequence constraint) {
  6. String charString = constraint.toString();
  7. List<Order> filteredList = new ArrayList<>();
  8. if (charString.isEmpty()||charString.length()==0) {
  9. filteredList.addAll(mOrderArrayList);
  10. } else {
  11. for (Order ord : mOrderArrayList) {
  12. if (ord.getOs_OrderNo().toLowerCase().contains(charString.toLowerCase())
  13. || ord.getItemName().toLowerCase().contains(charString.toLowerCase())) {
  14. filteredList.add(ord);
  15. }
  16. }
  17. }
  18. FilterResults filterResults = new FilterResults();
  19. filterResults.values = filteredList;
  20. return filterResults;
  21. }
  22. @Override
  23. protected void publishResults(CharSequence constraint, FilterResults results) {
  24. mListFilter = (ArrayList<Order>) results.values;
  25. notifyDataSetChanged();
  26. }
  27. };
  28. }
展开查看全部

相关问题