RatingBar Listener 在滚动 Recycler View 时调用

RatingBar Listener is calling when scrolling Recycler View

我在 RecyclerView 上工作,我的视图上有 ratindBar。问题是当我向下滚动时,我的 RatingBar 侦听器一次又一次地调用。我在下面提供适配器 class 代码。我有一个方法在我滚动时调用多次,实际上它必须只在我触摸评级栏时调用。

提前致谢。

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) {

        }


    }

}

我的问题通过检查布尔值 'fromTouch' 得到解决。它是来自 onTouch 事件的评分栏侦听器的变量。如果不触摸,它会给出错误的价值,而在触摸时会给出真实的价值。我做了以下代码,它现在终于可以工作了。

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