从数据库android填充radiobuttons

时间:2012-04-08 22:18:14

标签: android database radio-button populate

我正在开发一个驾驶学校测试应用程序,我需要一些帮助。

我有这样的xml文件:

<!-- language: lang-xml -->
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget28"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#AAC1E2" >

    <LinearLayout
        android:id="@+id/widget29"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/i1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
             />

        <TextView
            android:id="@+id/e1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Enun"
            android:textAppearance="?android:attr/textAppearanceMedium" />

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

            <RadioButton
                android:id="@+id/radio0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />
        </RadioGroup>

         <ImageView
            android:id="@+id/i2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
             />

        <TextView
            android:id="@+id/e2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Enun"
            android:textAppearance="?android:attr/textAppearanceMedium" />

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

            <RadioButton
                android:id="@+id/radio0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />
        </RadioGroup>

... x 30次和一个按钮,它将纠正测试并显示您是否通过。当你3个问题或更少的问题失败时,你通过测试。

问题以这种方式存储:

Id_question Id_topic Id_test问题答案答案B答案C答案图像

  • Id_question Id_topic和id_test是整数字段
  • 问答答案A-C是文本字段
  • AnswerOK是一个整数字段。如果AnswerA为OK = 1,AnswerB = 2,AnswerC = 3
  • 图像是从资源文件夹中提取的相关图像的名称。

我使用数据库填充xml中的每个字段。图像和问题以这种方式从数据库中提取:

<!-- language: lang-java -->
    Cursor c = adbh.query(bundle.getString("test")); 
    //"test"-->"SELECT question, image FROM table WHERE id_test = 1"

        Integer i = 1;

        if (c.moveToFirst()) {
            do {
                String path = c.getString(index);
                String nimage = "i"+i;
                int idImage = getResources().getIdentifier(nimage, "id", this.getPackageName());
                ImageView image = (ImageView) findViewById(idImage);
                int idDrawable = getResources().getIdentifier(ruta, "drawable", this.getPackageName());
                image.setImageResource(idDrawable);

                String nenun = "e"+i;
                String enun = c.getString(anotherIndex);
                int idEnun = getResources().getIdentifier(nenun, "id", this.getPackageName());
                TextView txtenun = (TextView) findViewById(idEnun);
                txtenun.setText(enun);

                i++;
            } while (c.moveToNext());

我如何填充radiobuttons?查询将是“SELECT AnswerA,AnswerB,AnswerC from table WHERE id_test = 1”

我的最后一个问题是如何纠正测试。我想在数组中存储radiobutton(我不知道具体如何),然后与正确的答案进行比较。查询将是“表WHERE id_test = 1中的SELECT AnswerOK”。

示例:

一系列已回答的问题:     1 1 1 2 2 3 2 3 1 3 2 ... 一组正确的答案:     3 2 1 2 2 3 2 3 2 2 2 ...

<!-- language: lang-java -->
    for (int i=0; i<30; i++)
    if (a[i] == b[i])
    numberOfRightAnswers++;

谢谢:)

2 个答案:

答案 0 :(得分:3)

  

我如何填充radiobuttons?查询将是“SELECT AnswerA,   AnswerB,来自表WHERE id_test = 1“

的AnswerC

可能希望直接在第一个查询中选择这些值,而不是:

Cursor c = adbh.query(bundle.getString("test")); 
    //"test"-->"SELECT question, image FROM table WHERE id_test = 1"

将:

Cursor c = adbh.query(bundle.getString("test")); 
    //"test"-->"SELECT question, AnswerA,  AnswerB, AnswerC, image FROM table WHERE id_test = 1"

然后在while循环中,将文本分配给RadioButton,就像您为TextView txtenun所做的那样。

  

我的最后一个问题是如何纠正测试。我想存储   radiobutton在数组中按下(我不确切知道如何)然后   与正确的答案进行比较。

为您的所有OnCheckedChangeListener()添加RadioGroup。在该监听器中,您将获得用户检查某些内容的RadioGroup以及已检查RadioButton的ID。用它来构造正确答案的数组。

一些建议:

也许您应该修改布局和当前的方法。让用户滚动你的30个问题布局可能不是一个好主意,你也加载了很多资源,尽管用户在得到那个特定问题之前不会真正看到它们(我不知道你的图像大小,如果它们很小,这可能不是问题)。您还有其他选择是ListView布局或根据需要填写的一个问题的简单布局,具体取决于用户所处的问题。我的建议是第二种选择。该选项还可以帮助您避免getIdentifier方法调用,此方法比findViewById慢,应该避免。贝娄是一个布局:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#AAC1E2" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/questionImage"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/questionText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Enun"
            android:textAppearance="?android:attr/textAppearanceMedium" />

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

            <RadioButton
                android:id="@+id/radio0"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="true"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />

            <RadioButton
                android:id="@+id/radio2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="RadioButton" />
        </RadioGroup>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:weightSum="3" >

            <Button
                android:id="@+id/previousQuestion"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:text="previous" />

            <Button
                android:id="@+id/validateTest"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:text="validate" />

            <Button
                android:id="@+id/nextQuestion"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_weight="1"
                android:text="next" />
        </LinearLayout>
    </LinearLayout>

</ScrollView>

您将对该测试中的所有问题(包括所有数据)进行查询,并从静态字段int counter = 0开始。当应用程序启动时,您将光标移动到计数器值(开始时为0):

c.moveToPosition(counter);

并使用该行中的值填充上述问题布局:

ImageView questionImage = (ImageView) findViewById(R.id.questionImage);
int idDrawable = getResources().getIdentifier(ruta, "drawable", this.getPackageName());
   questionImage.setImageResource(idDrawable);

String enun = c.getString(anotherIndex);
TextView txtenun = (TextView) findViewById(R.id.questionText);
txtenun.setText(enun);
// will do the same to populate the other parts of the question from the cursor

当用户按下nextQuestion Button时,您将增加counter值(您应该进行一些检查,这样就不会超出30个问题),移动光标再次到counter位置,然后像上面一样填充布局。当用户按下previousQuestion时,您递减counter,移动光标并再次使用数据填充布局。 此外,您只需向OnCheckedChangeListener添加一个RadioGroup。当该侦听器触发时,您应该存储问题ID(来自counter值,您应该能够告诉您哪个问题)以及数据结构中的所选RadioButton(可能是HashMap }),从数据库中检索测试的正确答案,看看用户是否是一个好的驱动程序。

您也可以(可能)优化您的数据库。

修改

private ArrayList<Integer> responses = new ArrayList<Integer>(); // this will hold the number of the correct answer. Note that this will work if the user answers question one after the other
// if the user skips question you'll get in trouble, this is one of the reasons why your design is not so good.

String rg = "radioGroup" + i;
int idRg = getResources().getIdentifier(rg, "id", this.getPackageName());
RadioGroup radioGroup = (TextView) findViewById(idRg);
radioGroup.setOnChekedChangeListener(new OnCheckedChangeListener(){
       public void onCheckedChanged (RadioGroup group, int checkedId) {
            if (group.getChildAt(0).getId() == checkedId) {
               responses.add(0); // the first answer was checked
            } else if (group.getChildAt(1).getId() == checkedId) {
               responses.add(1); // the first answer was checked
            } else if (group.getChildAt(2).getId() == checkedId) {
               responses.add(2); // the first answer was checked
            }
      } 
});

答案 1 :(得分:0)

根据@Luksprog的回答,这是我最后的工作循环:

Cursor c = adbh.query(bundle.getString("test"));

    Integer i = 1;

    if (c.moveToFirst()) {
        do {
            String ruta = c.getString(4);
            String nimage = "i" + i;
            int idImage = getResources().getIdentifier(nimage, "id",
                    this.getPackageName());
            ImageView image = (ImageView) findViewById(idImage);
            int idDrawable = getResources().getIdentifier(ruta, "drawable",
                    this.getPackageName());
            image.setImageResource(idDrawable);

            String rgname = "radioGroup"+i;
            int idRg = getResources().getIdentifier(rgname, "id",
                    this.getPackageName());
            RadioGroup rg = (RadioGroup) findViewById(idRg);
            rg.removeAllViews();
            RadioButton rb1 = new RadioButton(this);
            rb1.setId(i);
            rb1.setText(c.getString(1));
            rg.addView(rb1);
            RadioButton rb2 = new RadioButton(this);
            rb2.setId(i+1);
            rb2.setText(c.getString(2));
            rg.addView(rb2);
            RadioButton rb3 = new RadioButton(this);
            rb3.setId(i+2);
            rb3.setText(c.getString(3));
            rg.addView(rb3);


            String nenun = "e" + i;
            String enun = c.getString(0);
            int idEnun = getResources().getIdentifier(nenun, "id",
                    this.getPackageName());
            TextView txtenun = (TextView) findViewById(idEnun);
            txtenun.setText(enun);

            i++;
        } while (c.moveToNext());