Search code examples
androidadapterratingbar

RatingBar Listener is calling when scrolling Recycler View


I am working on RecyclerView where I have ratindBar on my views. Problem is that when I am scrolling down, my RatingBar listener is calling again and again. I am providing adapter class code below. I have a method which is calling multiple times when I am scrolling, in fact it has to be call only when I am touching rating bar.

Thanks in advance.

public class Order_Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {



    public void setiCartListener(ICart iCartListener) {
        this.iCartListener = iCartListener;
    }


    private OnItemClickListener onItemClickListener;



    @Override
    public int getItemViewType(int position) {



        if (isPositionFooter(position)) {
            return VIEW_TYPE_LOADING;
        }else if(filter.equals("") && position == 0 && isWorkshop ){
            ParseObject parseObject = arrayList.get(0);
            if(parseObject.has("isBanner")&& parseObject.getBoolean("isBanner")== true){
                return TYPE_HEADER;
            }
          }
        return VIEW_TYPE_ITEM;
    }

    private boolean isPositionFooter(int position) {
        return position == arrayList.size();
    }

    @Override
    public RecyclerView.ViewHolder  onCreateViewHolder(ViewGroup parent, int viewType) {


            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.order_view_list, parent, false);
            return new MemberViewHolder(view, onItemClickListener);

    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder  holder, int position) {

        final ParseObject parseObject = arrayList.get(position);
            final CartUtils cartUtils = cartUtilsItemsList.get(position);
        if(holder instanceof  MemberViewHolder){

            if (arrayList.size() > 0) {


                // ----------------  Rating Block  Start -----------------

                ((MemberViewHolder) holder).ratingBar.setEnabled(true);


                RatingBar.OnRatingBarChangeListener l=
                        new RatingBar.OnRatingBarChangeListener() {
                            public void onRatingChanged(RatingBar ratingBar,
                                                        float rating, boolean fromTouch) {
// This method is calling again and again when I am scrolling
                                dialogBoxRating(parseObject,rating);

                            }
                        };

                ((MemberViewHolder) holder).ratingBar.setOnRatingBarChangeListener(l);

                // Listeners Block  End

            }
        }
    }

    public void dialogBoxRating(final ParseObject pObject, final double ratingStar){
        DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int choice) {
                switch (choice) {
                    case DialogInterface.BUTTON_POSITIVE:
                      Toast.message("saved");
                        break;
                    case DialogInterface.BUTTON_NEGATIVE:
                        break;
                }
            }
        };

        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        builder.setMessage(R.string.do_you_want_to_save_the_rating).setTitle(R.string.cancel)
                .setPositiveButton(R.string.yes, dialogClickListener)
                .setNegativeButton(R.string.no, dialogClickListener).show();
    }


    @Override
    public int getItemCount() {
        return arrayList == null ? 0 : arrayList.size();
    }


    static class MemberViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        RatingBar ratingBar;

        public MemberViewHolder(View itemView, OnItemClickListener onItemClickListener) {
            super(itemView);

            ratingBar= (RatingBar) itemView.findViewById(R.id.ratingBar);
            itemView.setOnClickListener(this);
            this.onItemClickListener = onItemClickListener;
        }

        @Override
        public void onClick(View v) {

        }


    }

}

Solution

  • My problem is solved by checking boolean 'fromTouch'. It is a variable from rating bar listener for onTouch event. Without touch it is giving false value and on touch true. I did the following code and it is finally working now.

    ratingBar= (RatingBar) itemView.findViewById(R.id.ratingBar);
        itemView.setOnClickListener(this);
        this.onItemClickListener = onItemClickListener;
    
        //should set listener here
        RatingBar.OnRatingBarChangeListener l=
                new RatingBar.OnRatingBarChangeListener() {
                    public void onRatingChanged(RatingBar ratingBar,
                                                float rating, boolean fromTouch) {
    
    if(fromTouch == true){
                                dialogBoxRating(parseObject,rating);
                            }
    
                    }
                };
        ratingBar.setOnRatingBarChangeListener(l);