Search code examples
androidandroid-recyclerviewandroid-cardviewratingbar

How to access rating bar's rating in recyclerview


I am using card view and recycler view with footer. It is survey form with textview showing questions and ratingbar. There will be more than one questions and footer will have textarea and submit button. I tried to get the rating bar's rating on click of submit button but I am getting the rating of the last cardview of the recyclerview. Below is the code I am using to get the ratings. submitResponse() method is called on click of submit button and I am writing the code to get the rating's of all the cardview in it.

public class SurveyDetailsAdapter  extends  RecyclerView.Adapter<RecyclerView.ViewHolder>  {


private static final int FOOTER_VIEW = 1;
static List<SurveyQuestions> surveyQuestionses= new ArrayList<>();
public static Activity ctx;

public static ScheduleData scheduleData;
public static SurveyDetailsViewHolder vh;

public SurveyDetailsAdapter(List<SurveyQuestions> surveyQuestionses,Activity ctx,ScheduleData scheduleData) {
    this.surveyQuestionses = surveyQuestionses;
    this.ctx=ctx;
    this.scheduleData=scheduleData;
}

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

        View v;

    if (viewType == FOOTER_VIEW) {
        v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_footer, parent, false);
        FooterViewHolder vh = new FooterViewHolder(v);
        return vh;
    }
    v = LayoutInflater.from(parent.getContext()).inflate(R.layout.survey_details_view_layout, parent, false);
    SurveyDetailsViewHolder pvh = new SurveyDetailsViewHolder(v);
    return pvh;

}

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

   // holder.time.setText(String.valueOf(scheduleData.get(position).starttime+"-"+String.valueOf(scheduleData.get(position).endtime)));
  //  holder.title.setText(String.valueOf(scheduleData.get(position).title));
  //  holder.date.setText(String.valueOf(scheduleData.get(position).date));

    try {
        if (holder instanceof SurveyDetailsViewHolder) {
            vh = (SurveyDetailsViewHolder) holder;
            vh.question.setText(surveyQuestionses.get(position).question);

           // vh.bindView(position);


        } else if (holder instanceof FooterViewHolder) {
            FooterViewHolder vh = (FooterViewHolder) holder;

        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}



@Override
public int getItemCount() {
    if (surveyQuestionses == null) {
        return 0;
    }
    if (surveyQuestionses.size() == 0) {
        return 1;
    }

    return  surveyQuestionses.size()+1;
}

// Now define getItemViewType of your own.
@Override
public int getItemViewType(int position) {
    if (position ==surveyQuestionses.size()) {
        // This is where we'll add footer.
        return FOOTER_VIEW;
    }

    return super.getItemViewType(position);
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}

public class FooterViewHolder extends RecyclerView.ViewHolder {
    EditText comments;
    MainActivity mainActivity = (MainActivity) ctx;


    public FooterViewHolder(final View itemView) {
        super(itemView);

        itemView.findViewById(R.id.submit).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Do whatever you want on clicking the item

                submitResponse();
                Toast.makeText(mainActivity.getApplicationContext(),"Thank you.", Toast.LENGTH_SHORT).show();
                mainActivity.switchContent(Surveys.FRAGMENT_TAG);
            }
        });
        }

    public void submitResponse(){

        comments=(EditText)itemView.findViewById(R.id.comments);

        List<String> rat= new ArrayList<String>();

        for(int i=0;i<surveyQuestionses.size();i++){
            rat.add(String.valueOf(SurveyDetailsViewHolder.ratingBar.getRating()));
        }

        for(int j=0;j<rat.size();j++){
            Toast.makeText(mainActivity.getApplicationContext(),rat.get(0).toString()+rat.get(1).toString()+rat.get(2).toString(), Toast.LENGTH_SHORT).show();
        }

    }

    }

// So you're done with adding a footer and its action on onClick.
// Now set the default ViewHolder for NormalViewHolder

public static class SurveyDetailsViewHolder extends RecyclerView.ViewHolder {
   public static CardView cv;
    TextView question;
    public static RatingBar ratingBar;
    SurveyDetailsViewHolder(View itemView) {
        super(itemView);

        cv = (CardView) itemView.findViewById(R.id.card_view_layout);
        question = (TextView) itemView.findViewById(R.id.que1);
        ratingBar = (RatingBar) itemView.findViewById(R.id.ratingBar);




    }
}
}

Solution

  • You have SurveyQuestion POJO. Add your POJO new field , you can call it rating

    public class SurveyQuestion { 
        public float rating = 0.0f; //this will be default value, if user has not rate, this value will be passed
        // Your other variabes, constructors etc.
    }
    

    Then, you need to listen your rating bar changes on your RecyclerView Adapter

    public static class SurveyDetailsViewHolder extends RecyclerView.ViewHolder {
    public static CardView cv;
       TextView question;
       public static RatingBar ratingBar;
    
       SurveyDetailsViewHolder(View itemView) {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.card_view_layout);
            question = (TextView) itemView.findViewById(R.id.que1);
            ratingBar = (RatingBar) itemView.findViewById(R.id.ratingBar);
            ratingBar .setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {
            @Override
            public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
                surveyQuestionses.get(getPosition()).rating = ratingBar.getRating();
            }
        });
    
       }
    }
    

    Lastly on your submitResponse() method you can access your ratings from your surveyQuestionses list.

    public void submitResponse(){
    
        comments=(EditText)itemView.findViewById(R.id.comments);
    
        List<String> rat= new ArrayList<String>();
    
        for(int i=0;i<surveyQuestionses.size();i++){
            rat.add(String.valueOf(surveyQuestionses.rating));
        }
    }