java - recyclerview 中的 Radiogroup 没有状态

标签 java android

我有一个水平的回收 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/

相关文章:

java - 如何使用spring mvc3上传文件?

java - org.osgi.framework.BundleException : Could not find bundle: org. eclipse.equinox.console

android - 包权限的含义(邀请所有android开发者贡献)

java - 如何让ClusterManager识别默认Marker?

android - Gradle 错误 - ionic build android

android - 如何使用 mvvm 模式显示 alertDialog Box

java - 使用正则表达式匹配模式,排除某些字符

java - 在Java中连接多行SQL语句的有效方法?

java - 使用 setProperty 方法修改 oracle.security.idm.RoleProfile 的身份

android - Azure 通知中心 - 从 token 提供程序获取的 token 错误