首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ArrayAdapter中使用4种不同的无线按钮

如何在ArrayAdapter中使用4种不同的无线按钮
EN

Stack Overflow用户
提问于 2016-10-23 17:10:21
回答 1查看 781关注 0票数 1

我有一个自定义列表适配器,它在文本视图中有一个问题,在单选按钮中有四个选项作为答案。所有的无线按钮都绑定在一个无线电组中。问题是,我无法跟踪正在滚动的checked.On按钮,这些按钮被随机检查。如何存储选中的单选按钮?

公共类MCQAdapter扩展ArrayAdapter {

代码语言:javascript
复制
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;

}

}

代码语言:javascript
复制
public class MCQ {

String question,optionA,optionB,optionC,optionD,answer,userAnswer;

public MCQ(String quest,String a,String b,String c, String d,String ans){

    question = quest;
    optionA = a;
    optionB = b;
    optionC = c;
    optionD = d;
    answer = ans;

}

public String getQuestion(){
    return question;
}

public String getOptionA() {
    return optionA;
}

public String getOptionB() {
    return optionB;
}

public String getOptionC() {
    return optionC;
}

public String getOptionD() {
    return optionD;
}

public String getAnswer() {
    return answer;
}

public String getUserAnswer() {
    return userAnswer;
}

public void setUserAnswer(String userAnswer) {
    this.userAnswer = userAnswer;
}

}

代码语言:javascript
复制
public class PropertiesOfConstructionMaterail extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_properties_of_construction_materail);

    final ArrayList<MCQ> mcq = new ArrayList<MCQ>();

    //Creating Different Instance Of MCQ to genarte various questions for Properties of Consrtuction Material
    mcq.add(new MCQ("The property of material by which it can be beaten or rolled into thin plates, is called ?",
            "Malleability","Ductility","Plasticity","Elasticity","Malleability"));
    mcq.add(new MCQ("The property by which a body returns to its original shape after removal of the force, is called ?",
            "Plasticity","Elasticity","Ductility","Malleability","Elasticity"));
    mcq.add(new MCQ("The property of a material by which it can be drawn into smaller section due to tension, is called ?"
            ,"Plasticity","Ductility","Elasticity","Malleability","Ductility")); 

MCQAdapter adapter = new MCQAdapter(this,mcq);

    ListView listView = (ListView) findViewById(R.id.list);
    listView.setAdapter(adapter);
}

}

代码语言:javascript
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_mcqlist"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.silen.civilengineeringmcq.MCQList"
android:orientation="vertical">

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/Question_Block"
    android:textSize="18dp"
    android:textStyle="bold"/>

<RadioGroup
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/Radio_Group">

    <RadioButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/Option1_Block"
        android:checked="false"/>

    <RadioButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/Option2_Block"
        android:checked="false"/>

    <RadioButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/Option3_Block"
        android:checked="false"/>

    <RadioButton
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/Option4_Block"
        android:checked="false"/>

</RadioGroup>

EN

回答 1

Stack Overflow用户

发布于 2016-10-23 17:34:08

您应该在PoJo类(MCQ)周围创建一个包装器,命名为ViewModel,它将当前视图状态存储在适配器中。在您的情况下,该状态是单选按钮的状态。

它看起来将是:

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
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的包装器,而不是直接包含MCQ类。

代码语言:javascript
复制
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));

我觉得你应该有个选择

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40205559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档