如何在 recyclerview 中访问评级栏的评级

How to access rating bar's rating in recyclerview

我正在使用带页脚的卡片视图和回收站视图。 它是带有显示问题和评分栏的文本视图的调查表。 将有多个问题,页脚将有文本区域和提交按钮。 我试图在点击提交按钮时获得评级栏的评级,但我得到的是 recyclerview 的最后一个 cardview 的评级。 下面是我用来获取评级的代码。 单击提交按钮时调用 submitResponse() 方法,我正在编写代码以获取其中所有卡片视图的评分。

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




    }
}
}

您有 SurveyQuestion 个 POJO。添加您的 POJO 新字段,您可以将其命名为 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.
}

然后,您需要在 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();
        }
    });

   }
}

最后,在您的 submitResponse() 方法中,您可以从 surveyQuestions 列表中访问您的评分。

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