Java 如何在ArrayAdapter中使用带有4个不同单选按钮的Radiogroup
我有一个自定义列表适配器,在文本视图中有一个问题,在单选按钮中有四个选项作为答案。所有单选按钮都绑定在一个单选组中。 问题是我无法跟踪已检查的按钮。滚动按钮时会随机检查。 我如何存储选中的特定单选按钮Java 如何在ArrayAdapter中使用带有4个不同单选按钮的Radiogroup,java,android,listview,android-arrayadapter,radio-group,Java,Android,Listview,Android Arrayadapter,Radio Group,我有一个自定义列表适配器,在文本视图中有一个问题,在单选按钮中有四个选项作为答案。所有单选按钮都绑定在一个单选组中。 问题是我无法跟踪已检查的按钮。滚动按钮时会随机检查。 我如何存储选中的特定单选按钮 公共类MCQAdapter扩展了ArrayAdapter{ public MCQAdapter(Activity context, ArrayList<MCQ> mcq) { super(context, 0, mcq); } @NonNull @Override publ
公共类MCQAdapter扩展了ArrayAdapter{
public MCQAdapter(Activity context, ArrayList<MCQ> mcq) {
super(context, 0, mcq);
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View listItemView = convertView;
if (listItemView == null) {
listItemView = LayoutInflater.from(getContext()).inflate(R.layout.activity_mcqlist, parent, false);
}
final MCQ currentContent = (MCQ) getItem(position);
TextView content = (TextView) listItemView.findViewById(R.id.Question_Block);
content.setText(currentContent.getQuestion());
RadioGroup rg = (RadioGroup) listItemView.findViewById(R.id.Radio_Group);
final RadioButton rb1 = (RadioButton) listItemView.findViewById(R.id.Option1_Block);
rb1.setText(currentContent.getOptionA());
final RadioButton rb2 = (RadioButton) listItemView.findViewById(R.id.Option2_Block);
rb2.setText(currentContent.getOptionB());
final RadioButton rb3 = (RadioButton) listItemView.findViewById(R.id.Option3_Block);
rb3.setText(currentContent.getOptionC());
final RadioButton rb4 = (RadioButton) listItemView.findViewById(R.id.Option4_Block);
rb4.setText(currentContent.getOptionD());
return listItemView;
}
}
公共类属性FConstructionMaterail扩展AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u properties\u of\u construction\u Material);
最终ArrayList mcq=新ArrayList();
//创建不同的MCQ实例,以生成有关消耗材料特性的各种问题
添加(新的mcq(“可将其敲打或轧制成薄板的材料特性,称为?”),
“延展性”、“延展性”、“可塑性”、“弹性”、“延展性”);
添加(新的mcq(“物体在消除力后恢复其原始形状的属性称为?”),
“塑性”、“弹性”、“延展性”、“延展性”、“弹性”);
添加(新的mcq(“一种材料的特性,通过它可以由于张力而被拉伸成更小的截面,称为?”
“塑性”、“延展性”、“弹性”、“延展性”、“延展性”);
MCQAdapter适配器=新的MCQAdapter(此为mcq);
ListView ListView=(ListView)findViewById(R.id.list);
setAdapter(适配器);
}
}
您应该在PoJo类(MCQ)周围创建一个包装器,命名为ViewModel,它将当前视图状态存储在适配器中。在您的情况下,该状态是单选按钮的状态 它看起来像:
class ViewModel extends MCQ {
MCQ mcq;
int radioButtonSelectedId;
public ViewModel(MCQ mcq) {
this.mcq = mcq;
this.radioButtonSelectedId = R.id.Option1_Block;
}
public void setRadioButtonSelectedId(int id) {
this.id = id;
}
public int getRadioButtonSelectedId() {
return id;
}
//delegates to mcq getter/setter methods
}
您的getView
方法:
public View getView(int position, View convertView, ViewGroup parent) {
//your logic above
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
viewModel.setRadioButtonSelectedId(checkedId);
}
});
//same for other radio buttons
rb1.setChecked(viewModel.getRadioButtonSelectedId() == R.id.Option1_Block);
//your logic below
}
正如我上面提到的,适配器中的数组列表将包含ViewModel
s包装器,而不是直接包含MCQ
类
final ArrayList<ViewModel> mcqList = new ArrayList<>();
MCQ mcq = new MCQ("The property of material by which it can be beaten or rolled into thin plates, is called ?",
"Malleability","Ductility","Plasticity","Elasticity","Malleability")
mcqList.add(new ViewModel(mcq));
final ArrayList mcqList=new ArrayList();
MCQ MCQ=新的MCQ(“可将其敲打或轧制成薄板的材料特性,称为?”,
“延展性”、“延展性”、“可塑性”、“弹性”、“延展性”)
添加(新视图模型(mcq));
我认为您应该获得一个选项您应该在PoJo类(MCQ)周围创建一个包装器,将其命名为ViewModel,它将视图的当前状态存储在适配器中。在您的情况下,该状态是单选按钮的状态 它看起来像:
class ViewModel extends MCQ {
MCQ mcq;
int radioButtonSelectedId;
public ViewModel(MCQ mcq) {
this.mcq = mcq;
this.radioButtonSelectedId = R.id.Option1_Block;
}
public void setRadioButtonSelectedId(int id) {
this.id = id;
}
public int getRadioButtonSelectedId() {
return id;
}
//delegates to mcq getter/setter methods
}
您的getView
方法:
public View getView(int position, View convertView, ViewGroup parent) {
//your logic above
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
viewModel.setRadioButtonSelectedId(checkedId);
}
});
//same for other radio buttons
rb1.setChecked(viewModel.getRadioButtonSelectedId() == R.id.Option1_Block);
//your logic below
}
正如我上面提到的,适配器中的数组列表将包含ViewModel
s包装器,而不是直接包含MCQ
类
final ArrayList<ViewModel> mcqList = new ArrayList<>();
MCQ mcq = new MCQ("The property of material by which it can be beaten or rolled into thin plates, is called ?",
"Malleability","Ductility","Plasticity","Elasticity","Malleability")
mcqList.add(new ViewModel(mcq));
final ArrayList mcqList=new ArrayList();
MCQ MCQ=新的MCQ(“可将其敲打或轧制成薄板的材料特性,称为?”,
“延展性”、“延展性”、“可塑性”、“弹性”、“延展性”)
添加(新视图模型(mcq));
我想你应该有一个选择我仍然无法让代码正常工作。我按照你的要求做了,但是当我选中第一个收音机框的一个选项并向下滚动时,最初的复选框消失,并被转移到另一个radiogroup@NikhilRauniyar在ListView中,项目的视图由ListView循环使用,即创建一次视图,然后在上一个连接的项目不可见时作为下一个项目传递。因此,如果您没有在
getView
视图中正确地重置状态,则视图将表示一些previos项。因此,正如我建议的,您应该为每个单选按钮(rb1,2,3,4)执行此rb1.setChecked(viewModel.getRadioButtonSelectedId()==R.id.Option1_Block)
同时,使用第一个单选按钮id初始化ViewModel。请参见编辑后的答案。请您提供一个示例代码或一个类似于我的问题原因的示例,即使我实现了您的方法,我仍然有相同的问题。我已经在这个问题上犹豫了一天多了,我仍然无法让代码正常工作。我按照你的要求做了,但是当我选中第一个收音机框的一个选项并向下滚动时,最初的复选框消失,并被转移到另一个radiogroup@NikhilRauniyar在ListView中,项目的视图由ListView循环使用,即创建一次视图,然后在上一个连接的项目不可见时作为下一个项目传递。因此,如果您没有在getView
视图中正确地重置状态,则视图将表示一些previos项。因此,正如我建议的,您应该为每个单选按钮(rb1,2,3,4)执行此rb1.setChecked(viewModel.getRadioButtonSelectedId()==R.id.Option1_Block)
同时,使用第一个单选按钮id初始化ViewModel。请参见编辑后的答案。请您提供一个示例代码或一个类似于我的问题原因的示例,即使我实现了您的方法,我仍然有相同的问题。我在这个问题上被耽搁了一天多