【问题标题】:How to use Radiogroup with 4 different Radio Button In ArrayAdapter如何在 ArrayAdapter 中使用带有 4 个不同单选按钮的 Radiogroup
【发布时间】:2017-03-05 11:19:19
【问题描述】:

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


公共类 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;

}

}

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;
}

}

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);
}

}

<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>

【问题讨论】:

    标签: java android listview android-arrayadapter radio-group


    【解决方案1】:

    您应该围绕您的 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
    }
    

    正如我上面提到的,适配器内的数组列表将包含 ViewModels 包装器,而不是直接包含 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));
    

    我认为你应该得到一个选择

    【讨论】:

    • 我仍然无法让代码正常工作。我按照你的要求做了,但是当我检查第一个单选框的选项并向下滚动时,初始检查会消失并转移到其他无线电组
    • @NikhilRauniyar 在 ListView 中的项目视图由 listview 回收,即视图被创建一次,然后当前一个连接的项目不可见时作为下一个项目传递。因此,如果您没有在getView 中正确重置状态,则视图将代表一些 previos 项。因此,正如我建议的那样,您应该为每个单选按钮(rb1、2、3、4)执行此rb1.setChecked(viewModel.getRadioButtonSelectedId() == R.id.Option1_Block),并使用第一个单选按钮 ID 初始化您的 ViewModel。查看编辑后的答案
    • 您能否提供一个示例代码或类似于我的问题原因的示例,即使在我实施您的方法后,我仍然遇到同样的问题。我被这个问题困扰了一天多
    猜你喜欢
    • 2018-01-13
    • 1970-01-01
    • 2013-11-22
    • 2011-04-26
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多