簡體   English   中英

recyclerview 中的 Searchview 復制數據

[英]Searchview in recyclerview duplicates the data

搜索視圖在操作欄中實現,搜索工作正常,但例如,如果用戶搜索兩個字符pa ,我的列表包含與pa相關的 2 個數據,即 pack1,pack2 然后數據加載到回收器視圖中。 現在如果用戶輸入另一個字符l到前面的字符 pa,現在我的搜索視圖有pal ,但數組列表與搜索不匹配,列表不包含任何帶有 pal 的項目。 即,現在回收站視圖為空。 現在,如果我清除字符l ,列表會重新加載數據包 1、包 2,但結果會加載 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();
        }
    };
}

}

點擊監聽代碼

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM