Recyclerview以编程方式添加radiobutons

时间:2018-01-15 12:12:18

标签: android performance android-recyclerview

我正在创建一个带有Java的Android应用程序,它会显示一个问题以及3个或4个选项(MCQ应用程序)。我在XML中使用带有TextView的RecyclerView来解决问题。

但是,我对如何为选项部分创建单选按钮/复选框感到困惑,因为它们是动态的。意思是,根据数据库中的条目,一个问题可能有任意数量的选项作为1到6的单选按钮。此外,根据数据库条目,很少有问题可能有复选框而不是单选按钮。

由于这些是在运行时决定的,因此我无法在XML文件中保留这些radiobuttons / checkboxes。最初我尝试在onBindViewHolder方法中创建它们,但这样做会显着减慢滚动速度,因为即使在滚动时也会调用此方法。由于这是一个非常常见的用例,我想相信该框架必须有一个现成的解决方案,我还没有发现。

我不想添加所有可能的单选按钮/复选框,并在运行时使用它们的可见性。

1 个答案:

答案 0 :(得分:0)

您可以将您的xml文件创建为 -

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="Question Text " />

    <RadioGroup
        android:id="@+id/radioGroup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dp" />

</LinearLayout>

在你的适配器中,让你有问题的arraylist说

ArrayList<Question> queList;

问题实例包含

class Question{
String question;
int nubOfOptions;
String[] options;
int selectedOption = 0;
}

现在首先将ViewHOlder中的radioGroup的id作为 -

RadioGroup radioGroup = (RadioGroup)view.findViewById(R.id.radioGroup);

现在在onBindViewHolder中你可以做 -

onBindViewHolder(int position, ....){
  Question que = queList.get(position);
  radioGroup.removeAllViews();
  for(int count=0; count<radioBtnCount;count++){

       RadioButton btn= new RadioButton(context);
       btn.setText("you option");
       if(selectedOption==count+1){
        btn.setCheck(true);
        }
       radioGroup.addView(btn);


    }
}

你必须删除所有视图,否则在滚动时会遇到问题。