简体   繁体   English

SearchView从RecyclerView添加错误的项目

[英]SearchView adding wrong item from RecyclerView

Actually i'm trying to add a SearchView in my RecyclerView that will permise to search different kind of items on it, 实际上,我正在尝试在我的RecyclerView中添加一个SearchView,以便搜索其中的各种商品,

But i'm getting a problem when i'm searching for one result in SearchView and it has been found when i click on it the selected item is wrong or better it's ever the item from main ArrayList and not searched result as you can see in the gif below i'm searching for Bayles when i press on it snackbar saying that i've selected Bayles but when i add it as child item to another recyclerView it has added ABBONDANTE and not Bayles. 但是当我在SearchView中搜索一个结果时遇到了一个问题,当我单击它时就发现了所选择的项目是错误的,或者更好的是,它是来自主ArrayList的项目,而不是您在中看到的搜索结果当我按它的小吃店说我已经选择了贝勒斯时,我正在搜索贝勒斯下面的gif图像,但是当我将其作为子项添加到另一个回收站时,它添加了ABBONDANTE而不是贝勒斯。

在此处输入图片说明

Here is my ViewHolder from the Adapter 这是我的适配器的ViewHolder

itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(listener != null){
                    int position = getAdapterPosition();
                    if(position != RecyclerView.NO_POSITION){
                        listener.onItemClick(position);
                        Snackbar.make(v,variantiConstructors.get(position).getDeskT(),Snackbar.LENGTH_SHORT).show();
                    }
                }
            }
        });

While here is my onClickListener from the Activity where i add the item to other RecyclerView 这是我来自Activity的onClickListener,我将项目添加到其他RecyclerView

   adapterVarianti.setOnItemClickListener(new AdapterVarianti.OnItemClickListener() {
            @Override
            public void onItemClick(int position) {

                search.clearFocus();

                if (dummyDataItems.size() != 0) {

                    if (tipo.toString().equals("CON ") || tipo.toString().equals("PIU' ") || tipo.toString().equals("MENO ") || tipo.toString().equals("SENZA ")) {

// Here i'm adding the selected item to a String builder but i think it's here where i'm doing something wrong

                        tipo.append(filteredVariable.get(position).getDeskT());

// Adding item from the recyclerView where there is searchView to last item from the recyclerView on background.

                        ItemPTERM lastAdded = dummyDataItems.get(dummyDataItems.size() - 1);
                        lastAdded.setVariant(new Variant(tipo.toString()));

                        if (exampleAdapter.getItemCount() > 0) {
                            mRecyclerViewTOP.scrollToPosition(exampleAdapter.getItemCount() - 1);
                        }
                        exampleAdapter.notifyDataSetChanged();

                        tipo = new StringBuilder();

                        if(segmentedButtonGroup.getPosition() == 0){
                            tipo = new StringBuilder();
                            tipo.append("CON ");
                        }
                        if(segmentedButtonGroup.getPosition() == 1){
                            tipo = new StringBuilder();
                            tipo.append("PIU' ");
                        }
                        if(segmentedButtonGroup.getPosition() == 2){
                            tipo = new StringBuilder();
                            tipo.append("MENO ");
                        }
                        if(segmentedButtonGroup.getPosition() == 3){
                            tipo = new StringBuilder();
                            tipo.append("SENZA ");
                        }

                    }
                }
            }
        });

Here is my Adapter code with filter 这是我的带有过滤器的适配器代码

public class AdapterVarianti extends RecyclerView.Adapter<AdapterVarianti.ExampleViewHolder>  implements Filterable {


    private ArrayList<VariantiConstructor> variantiConstructors;
    private ArrayList<VariantiConstructor> mFilteredList;
    private OnItemClickListener mListener;

    public interface  OnItemClickListener{
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener){
        mListener = listener;
    }

    @NonNull
    @Override
    public AdapterVarianti.ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.varianti_recycler,parent,false);
        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        v.setLayoutParams(lp);
        return new AdapterVarianti.ExampleViewHolder(v, mListener);
    }

    AdapterVarianti(ArrayList<VariantiConstructor> exampleList){
        variantiConstructors = exampleList;
        mFilteredList = variantiConstructors;
    }

    @Override
    public void onBindViewHolder(@NonNull final AdapterVarianti.ExampleViewHolder holder, final int position) {
        final VariantiConstructor item = variantiConstructors.get(position);

        holder.desc.setText(item.getDeskT());
        holder.prepiu.setText(String.valueOf(item.getPrice()));
        holder.premeno.setText(String.valueOf(item.getPacq()));

        if(position % 2 == 0 ){
            holder.itemView.setBackgroundColor(Color.parseColor("#17e1a0"));

        }else if(position % 2 == 1){
            holder.itemView.setBackgroundColor(Color.parseColor("#7EC0EE"));
        }

    }


    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                final FilterResults oReturn = new FilterResults();
                final ArrayList<VariantiConstructor> results = new ArrayList<>();
                if (mFilteredList == null)
                    mFilteredList = new ArrayList<>(variantiConstructors);
                if (constraint != null && constraint.length() > 0) {
                    if (mFilteredList != null && mFilteredList.size() > 0) {
                        for (final VariantiConstructor cd : mFilteredList) {
                            if (cd.getDeskT().toLowerCase()
                                    .contains(constraint.toString().toLowerCase()))
                                results.add(cd);
                        }
                    }
                    oReturn.values = results;
                    oReturn.count = results.size(); //newly Aded by ZA
                } else {
                    oReturn.values = mFilteredList;
                    oReturn.count = mFilteredList.size(); //newly added by ZA
                }
                return oReturn;
            }

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(final CharSequence constraint,
                                          FilterResults results) {
                variantiConstructors = new ArrayList<>((ArrayList<VariantiConstructor>) results.values);
                // FIXME: 8/16/2017 implement Comparable with sort below
                ///Collections.sort(itemList);
                notifyDataSetChanged();
            }
        };
    }

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

    public class ExampleViewHolder extends RecyclerView.ViewHolder {

        public TextView desc;
        public TextView prepiu;
        public TextView premeno;

        ExampleViewHolder(View itemView, final OnItemClickListener listener) {
            super(itemView);

            desc = itemView.findViewById(R.id.Desc);
            prepiu = itemView.findViewById(R.id.PrePiu);
            premeno = itemView.findViewById(R.id.PreMeno);


            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(listener != null){
                        int position = getAdapterPosition();
                        if(position != RecyclerView.NO_POSITION){
                            listener.onItemClick(position);
                            Snackbar.make(v,variantiConstructors.get(position).getDeskT(),Snackbar.LENGTH_SHORT).show();
                        }
                    }
                }
            });


        }
    }


}

Solve by passing again the list to Activity by the following code: 通过使用以下代码将列表再次传递给Activity来解决:

public ArrayList<VariantiConstructor> getList(){
    return variantiConstructors;
}

And by this in activity code : 并在活动代码中:

 tipo.append(adapterVarianti.getList().get(position).getDeskT());

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM