2017-11-09 3 views
-1

Ich arbeite an RecyclerView, wo ich ratindBar auf meine Ansichten habe. Problem ist, dass, wenn ich nach unten scrolle, mein RatingBar-Listener immer wieder anruft. Ich stelle unten einen Adapterklassencode zur Verfügung. Ich habe eine Methode, die mehrere Male aufruft, wenn ich scrolle, in der Tat muss es nur Anruf sein, wenn ich Bewertungsleiste berühre.RatingBar Listener ruft beim Scrollen Recycler View

Vielen Dank im Voraus.

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

     } 


    } 

} 

Antwort

0

Mein Problem wird gelöst, indem boolean 'fromTouch' überprüft. Es ist eine Variable aus dem Bewertungsbalken-Listener für das onTouch-Ereignis. Ohne Berührung gibt es falschen Wert und bei Berührung wahr. Ich habe den folgenden Code gemacht und es funktioniert jetzt endlich.

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