RadioGroup中的RecyclerView和RadioButton

时间:2018-09-11 12:01:46

标签: java android android-recyclerview radio-button radio-group

我有RecyclerView,在RowItem布局中,我有RadioGroup,在其中,我有两个RadioButton。如果我选择“第一项”并滚动到底部的第8位,第16位...,则选中:| 如何处理?

tnx作为答案..如果您需要任何信息..我放主题

ques_item_row.xml

 <RadioGroup
                    android:id="@+id/ques_radio_group"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/txt_ques_title"
                    android:layout_gravity="end|center"
                    android:gravity="start"
                    android:orientation="vertical"
                    android:textAlignment="textStart"
                    android:textDirection="rtl">

                    <android.support.v7.widget.AppCompatRadioButton
                        android:id="@+id/first_ques"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_gravity="end|right"
                        android:layout_margin="@dimen/quest_margin"
                        android:gravity="end|right"
                        android:checked="false"
                        android:padding="@dimen/quest_padding"
                        android:text="@{question.firstQuest}"
                        android:textColor="@color/ques"
                        android:textDirection="ltr"
                        android:textSize="@dimen/text_ques"
                        />

                    <android.support.v7.widget.AppCompatRadioButton
                        android:id="@+id/second_ques"
                        android:layout_below="@+id/first_ques"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_gravity="end|right"
                        android:layout_margin="@dimen/quest_margin"
                        android:gravity="end|right"
                        android:checked="false"
                        android:padding="@dimen/quest_padding"
                        android:text="@{question.secondQuest}"
                        android:textColor="@color/ques"
                        android:textDirection="ltr"
                        android:textSize="@dimen/text_ques"
                        />


                </RadioGroup>

Question.java

public class Question {

  private String questNum;
  private String questTitle;
  private String firstQuest;
  private String secondQuest;
  private int score = 0;
  private int firstQuestScore = 2;
  private int secondQuestScore = 3;

  private boolean isFirstChecked;
  private boolean isSecondChecked;


  public Question(String questNum, String questTitle, String firstQuest, String secondQuest) {
    this.questTitle = questTitle;
    this.firstQuest = firstQuest;
    this.secondQuest = secondQuest;
    this.questNum = questNum;

  }

  public Question() {

  }


  public String getQuestTitle() {
    return questTitle;
  }

  public void setQuestTitle(String questTitle) {
    this.questTitle = questTitle;
  }

  public String getFirstQuest() {
    return firstQuest;
  }

  public void setFirstQuest(String firstQuest) {
    this.firstQuest = firstQuest;
  }

  public String getSecondQuest() {
    return secondQuest;
  }

  public void setSecondQuest(String secondQuest) {
    this.secondQuest = secondQuest;
  }

  public String getQuestNum() {
    return questNum;
  }

  public void setQuestNum(String questNum) {
    this.questNum = questNum;
  }

  public boolean isFirstChecked() {
    return isFirstChecked;
  }

  public void setFirstChecked(boolean firstChecked) {
    isFirstChecked = firstChecked;
  }

  public boolean isSecondChecked() {
    return isSecondChecked;
  }

  public void setSecondChecked(boolean secondChecked) {
    isSecondChecked = secondChecked;
  }

  public int getScore() {
    return score;
  }

  public void setScore(int questNum, int questScore) {
    this.score = ((questNum * questScore) + questNum);
  }


  public int getFirstQuestScore() {
    return firstQuestScore;
  }

  public void setFirstQuestScore(int firstQuestScore) {
    this.firstQuestScore = firstQuestScore;
  }

  public int getSecondQuestScore() {
    return secondQuestScore;
  }

  public void setSecondQuestScore(int secondQuestScore) {
    this.secondQuestScore = secondQuestScore;
  }


  public void mathScore(int questNum, int questScore) {
  }
}

QuestionAdapter.java

 public class MbtiQuestAdapter extends RecyclerView.Adapter<MbtiQuestAdapter.MbtiQuestViewHolder> {

  private Context context;
  private List<Question> questionList;
  private LayoutInflater layoutInflater;
  private FloatingActionButton fabResult;
  private CoordinatorLayout coordinator;
  private int checkRadio = 0;
  private Snackbar snackbar;
  private int totalScore = 0;


  private static final String TAG = "MbtiQuestAdapter";

  public MbtiQuestAdapter(Context context, List<Question> questionList, FloatingActionButton fab, CoordinatorLayout coordinator) {
    this.context = context;
    this.questionList = questionList;
    this.fabResult = fab;
    this.coordinator = coordinator;
  }


  @NonNull
  @Override
  public MbtiQuestViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    if (layoutInflater == null) {
      layoutInflater = LayoutInflater.from(context);
    }

    QuesItemRowBinding binding = DataBindingUtil.inflate(layoutInflater,
      R.layout.ques_item_row, parent, false);

    return new MbtiQuestViewHolder(binding);
  }


  @Override
  public void onBindViewHolder(@NonNull final MbtiQuestViewHolder holder, final int position) {

    final Question question = questionList.get(position);
    holder.binding.setQuestion(question);

    //Fix the select the radio Button when first Select 8th and... do not selected



    //************************************************************


    //Check if all question do not click do not allow go to the next page

    holder.binding.quesRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
      @Override
      public void onCheckedChanged(RadioGroup group, int checkedId) {
        if (holder.binding.firstQues.isChecked() || holder.binding.secondQues.isChecked()) {
          checkRadio++;

        } else {
//          snackbar = Snackbar.make(coordinator, R.string.choose_one_of_theme, Snackbar.LENGTH_INDEFINITE);
//          snackbar.show();
        }
      }
    });



   if (fabResult != null) {
      fabResult.setOnClickListener(new View.OnClickListener() {
                                     @Override
                                     public void onClick(View v) {
                                       if (checkRadio == 60) {
                                         context.startActivity(new Intent(context, ResultActivity.class));

                                         totalScore = 0;
                                         for (int i = 0; i < 60; i++) {
                                           totalScore = totalScore + question.getScore();
                                           Log.i(TAG, "TotalScore: " + totalScore);
                                         }


                                         switch (totalScore) {
                                         }

                                       } else {
                                         snackbar = Snackbar.make(coordinator, R.string.check_all_ques_err, Snackbar.LENGTH_SHORT);
                                         snackbar.show();


                                       }
                                     }
                                   }

      );

      //*************************************************************



    }
  }


  @Override
  public int getItemCount() {
    return questionList.size();
  }

  public class MbtiQuestViewHolder extends RecyclerView.ViewHolder {

    private QuesItemRowBinding binding;

    public MbtiQuestViewHolder(QuesItemRowBinding binding) {
      super(binding.getRoot());
      this.binding = binding;

    }
  }


}

请帮助我..我也添加了一些屏幕截图... tnx很多

我尝试了此代码,但没有成功:

holder.binding.firstQues.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {

        question.setFirstChecked(holder.binding.firstQues.isChecked());
        holder.binding.firstQues.setChecked(holder.binding.firstQues.isChecked());

        question.setSecondChecked(false);
        holder.binding.secondQues.setChecked(false);
      }
    });

    holder.binding.secondQues.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {

        question.setFirstChecked(false);
        holder.binding.firstQues.setChecked(false);

        question.setSecondChecked(holder.binding.secondQues.isChecked());
        holder.binding.secondQues.setChecked(holder.binding.secondQues.isChecked());
      }
    });

    holder.binding.firstQues.setChecked(question.isFirstChecked());
    holder.binding.secondQues.setChecked(question.isSecondChecked());

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

private int isFirstQuestionChecked = false添加到模型中,并在选择此RadioButton时进行更改。在您的适配器中显示RadioButton

的正确值
if (element.isFirstQuestionChecked == true) {
    selectRadioButton()
} else {
    deselectRadioButton() // it's important!
}

答案 1 :(得分:0)

您必须为模型保留选定的单选按钮ID。

1>在模型中选择selectedId。

class Model{
  int selctedId;
  // getter setter
}

2>将此ID附加到您的广播组。

@Override
public void onBindViewHolder(final CoachListViewHolder holder, final int position) {
    Model model = list.get(position);
    holder.radioGroup.check(model.getSelectedId);
    holder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
    {
        public void onCheckedChanged(RadioGroup group, int checkedId)
        {
         model.setSelectedId(checkedId);
        }
    });
  

在此解决方案中,我们将选定的ID保留在模型中,然后通过radioGroup.check(model.getSelectedId);将该字段附加到广播组中

原因

如果您不保留所选的值,那么当用户滚动位置时,它将被回收。

我也找到了一个相关的question

经过良好测试的解决方案

您正在使用数据绑定,因此上述解决方案可能更短。使用two-way binding保留选定的ID。

Item.java

public class Item extends BaseObservable{
    private int selectedId;

    public int getSelectedId() {
        return selectedId;
    }

    public void setSelectedId(int selectedId) {
        this.selectedId = selectedId;
    }
}

row_list.xml

<data>

    <variable
        name="item"
        type="com.innovanathinklabs.sample.ui2.Item"/>

</data>

<RadioGroup
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="20dp"
    android:background="@color/colorPrimary"
    android:checkedButton="@={item.selectedId}"
    >

    <android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/rbMale"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="male"/>

    <android.support.v7.widget.AppCompatRadioButton
        android:id="@+id/rbFemale"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="female"/>
</RadioGroup>

现在,当您需要获取所选项目时。然后这样做。

if(list.get(1).getSelectedId() == R.id.rbMale){
 // male is selected
}
else if (list.get(1).getSelectedId() == R.id.rbMale){
 // female is selcted
}

还从单选组和单选按钮中删除任何其他不必要的逻辑。

数据绑定魔术是

此代码已转换为android:checkedButton="@={item.selectedId}"

@Override
public void onBindViewHolder(final CoachListViewHolder holder, final int position) {
    Model model = list.get(position);
    holder.radioGroup.check(model.getSelectedId);
    holder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
    {
        public void onCheckedChanged(RadioGroup group, int checkedId)
        {
         model.setSelectedId(checkedId);
        }
    });

更新

这是在项目布局中绑定项目的方式。

holder.binding.setItem(list.get(position));