gpt4 book ai didi

java - recyclerview 中的 Radiogroup 没有状态

转载 作者:行者123 更新时间:2023-11-29 02:25:48 25 4
gpt4 key购买 nike

我有一个水平的回收 View ,其中每个列表项都有一个带有 4 个单选按钮的单选组。如何正确存储每个 radio 组的状态。这是我的代码和视频演示。在向左/向右滚动时,单击时 radio 中的第一个和最后一个状态为 false。谢谢

链接 youtube 演示[ https://www.youtube.com/watch?v=XnSruP81Z-Q][1]

这是适配器:

> public class QuizAdapter extends
> RecyclerView.Adapter<QuizAdapter.ViewHolder> {
> private Context mContext;
> private List<Question> mQuestionList;
> private List<Answer> mAnswerList;
> private List<AnswerByQuestion> mAnswerByQuestionList;
>
> public interface CommunicateQuiz {
> void onUserChooseAnswer(int question, int answer);
> }
>
> CommunicateQuiz communicateQuiz;
>
> public void setOnItemClickListener(CommunicateQuiz clickListener){
> this.communicateQuiz = clickListener;
> }
> public QuizAdapter(Context mContext,
> List<Question> mQuestionList,
> List<Answer> mAnswerList,
> List<AnswerByQuestion> mAnswerByQuestionList) {
> this.mContext = mContext;
> this.mQuestionList = mQuestionList;
> this.mAnswerList = mAnswerList;
> this.mAnswerByQuestionList = mAnswerByQuestionList;
>
> }
>
> @NonNull
> @Override
> public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
> View v = LayoutInflater.from(mContext).inflate(R.layout.item_quiz, parent,
> false);
> return new QuizAdapter.ViewHolder(v);
> }
>
> @Override
> public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
> Question question = mQuestionList.get(position);
> holder.tvQuestion.setText("Câu " + (position + 1) + ". " + question.getContentQuestion());
>
> List<AnswerByQuestion> list = new ArrayList();
> int idQuestion = question.getIdQuestion();
> for (AnswerByQuestion answerByQuestion : mAnswerByQuestionList) {
> if (idQuestion == answerByQuestion.getIdQuestion()) {
> list.add(answerByQuestion);
> }
> }
>
> //get content answer
> final List<Answer> listUser = new ArrayList<>();
> for (Answer answer : mAnswerList) {
> int idAnswer = answer.getIdAnswer();
> for (AnswerByQuestion answerByQuestion : list) {
> if (idAnswer == answerByQuestion.getIdAnswer()) {
> listUser.add(answer);
> }
> }
> }
>
> //set data
> holder.rbAnswerA.setText("A. " + listUser.get(0).getContentAnswer());
> holder.rbAnswerB.setText("B. " + listUser.get(1).getContentAnswer());
> holder.rbAnswerC.setText("C. " + listUser.get(2).getContentAnswer());
> holder.rbAnswerD.setText("D. " + listUser.get(3).getContentAnswer());
>
> //radiobutton group check
> holder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
> @Override
> public void onCheckedChanged(RadioGroup radioGroup, int i) {
>
> mQuestionList.get(position).setAnswered(true);
>
> switch (i) {
> case R.id.rb_answer_a:
> communicateQuiz.onUserChooseAnswer(position, listUser.get(0).getIdAnswer());
> break;
> case R.id.rb_answer_b:
> communicateQuiz.onUserChooseAnswer(position, listUser.get(1).getIdAnswer());
> break;
> case R.id.rb_answer_c:
> communicateQuiz.onUserChooseAnswer(position, listUser.get(2).getIdAnswer());
> break;
> case R.id.rb_answer_d:
> communicateQuiz.onUserChooseAnswer(position, listUser.get(3).getIdAnswer());
> break;
> }
>
> }
> });
> }
>
> @Override
> public int getItemCount() {
> return mQuestionList.size();
> }
>
> static class ViewHolder extends RecyclerView.ViewHolder{
> TextView tvQuestion;
> RadioGroup radioGroup;
> RadioButton rbAnswerA;
> RadioButton rbAnswerB;
> RadioButton rbAnswerC;
> RadioButton rbAnswerD;
> CardView cvQuiz;
>
> ViewHolder(View view) {
> super(view);
> tvQuestion = view.findViewById(R.id.tv_question);
> radioGroup = view.findViewById(R.id.rg_quiz);
> rbAnswerA = view.findViewById(R.id.rb_answer_a);
> rbAnswerB = view.findViewById(R.id.rb_answer_b);
> rbAnswerC = view.findViewById(R.id.rb_answer_c);
> rbAnswerD = view.findViewById(R.id.rb_answer_d);
> cvQuiz =view.findViewById(R.id.cv_quiz);
> }
> } }

最佳答案

来自developer guides :

The RecyclerView creates only as many view holders as are needed to display the on-screen portion of the dynamic content, plus a few extra. As the user scrolls through the list, the RecyclerView takes the off-screen views and rebinds them to the data which is scrolling onto the screen.

这意味着您需要存储 View 的状态,并在 onBindViewHolder 中重新应用 View 。

向您的适配器添加一个字段以存储 RecyclerView 中每个位置的选定按钮 ID:

private SparseIntArray selectedIDs = new SparseIntArray();

在 OnCheckedChangeListener 中,存储选定的按钮 id:

holder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup radioGroup, int i) {

mQuestionList.get(position).setAnswered(true);

selectedIDs.put(position, i);

switch (i) {
case R.id.rb_answer_a:
communicateQuiz.onUserChooseAnswer(position, listUser.get(0).getIdAnswer());
break;
case R.id.rb_answer_b:
communicateQuiz.onUserChooseAnswer(position, listUser.get(1).getIdAnswer());
break;
case R.id.rb_answer_c:
communicateQuiz.onUserChooseAnswer(position, listUser.get(2).getIdAnswer());
break;
case R.id.rb_answer_d:
communicateQuiz.onUserChooseAnswer(position, listUser.get(3).getIdAnswer());
break;
}

}
});

在onBindViewHolder中,设置选中的单选按钮。

holder.radioGroup.check(selectedIDs.get(position, -1));

关于java - recyclerview 中的 Radiogroup 没有状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52287458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com