RadioGroup 中的 RecyclerView 和 RadioButton
RecyclerView And RadioButton in RadioGroup
我有 RecyclerView,在 RowItem 布局中有 RadioGroup,在其中有两个 RadioButton。如果我 select 第一项并滚动到底部,第 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;
}
}
}
请帮助我..我也添加了一些截图......非常感谢
我试过这段代码但没有用:
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());
将 private int isFirstQuestionChecked = false
添加到您的模型中,并在您 select 此 RadioButton
时更改它。在您的适配器中显示 RadioButton
的正确值
if (element.isFirstQuestionChecked == true) {
selectRadioButton()
} else {
deselectRadioButton() // it's important!
}
您必须将选定的单选按钮 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);
}
});
In this solution we hold selected id in model, and we attach back this field to radio group by radioGroup.check(model.getSelectedId);
原因
当您不保留所选值时,它会在用户滚动位置时被回收。
我也找到了相关的 。
经过充分测试的解决方案
您正在使用数据绑定,因此上述解决方案可以更简短。使用 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));
我有 RecyclerView,在 RowItem 布局中有 RadioGroup,在其中有两个 RadioButton。如果我 select 第一项并滚动到底部,第 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;
}
}
}
请帮助我..我也添加了一些截图......非常感谢
我试过这段代码但没有用:
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());
将 private int isFirstQuestionChecked = false
添加到您的模型中,并在您 select 此 RadioButton
时更改它。在您的适配器中显示 RadioButton
if (element.isFirstQuestionChecked == true) {
selectRadioButton()
} else {
deselectRadioButton() // it's important!
}
您必须将选定的单选按钮 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);
}
});
In this solution we hold selected id in model, and we attach back this field to radio group by
radioGroup.check(model.getSelectedId);
原因
当您不保留所选值时,它会在用户滚动位置时被回收。
我也找到了相关的
经过充分测试的解决方案
您正在使用数据绑定,因此上述解决方案可以更简短。使用 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));