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。请参见编辑后的答案。请您提供一个示例代码或一个类似于我的问题原因的示例,即使我实现了您的方法,我仍然有相同的问题。我在这个问题上被耽搁了一天多