Ошибка при выборе параметра в динамически создаваемом множественном макете радиогруппы. Некоторые из переключателей автоматически проверяются - PullRequest
0 голосов
/ 09 января 2012

У меня есть список из 10 вопросов с несколькими вариантами ответов, и у каждого вопроса есть «RadioGroup». Но когда я выбираю опцию для вопроса, некоторые опции других вопросов выбираются автоматически.

Пусть Я выбрал вариант для вопроса - 1. затем номера вопросов - 5, 9 выбираются автоматически с той же опцией.

Когда я выбираю вариант для вопроса - 2, номера вопросов - 6, 10 выбираются автоматически с той же опцией.

Этого не должно быть. Когда я выбираю опцию, должна быть отмечена только эта опция в этой RadioGroup. Пожалуйста, помогите мне исправить это.

Я занимаюсь разработкой мобильного теста. Когда пользователь вводит свое имя пользователя и пароль, сервер аутентифицирует это. Для авторизованных пользователей он возвращает документ с вопросом в виде JSONObject. И каждый экзамен будет иметь exam_id и список из 10 вопросов с множественным выбором, в то время как каждый вопрос имеет один уникальный «id», «question» и четыре варианта «A», «B», «C» и «D», как указано ниже. Объект «questions» - это JSONArray.

{
"exam_id": 0, 
"questions": [
    {
        "A": "A", 
        "C": "c", 
        "B": "b",      
        "D": "d", 
        "question": "A", 
        "id": 1, 
    }, 
    {
        "A": "a", 
        "C": "c", 
        "B": "B", 
        "D": "d", 
        "question": "B", 
        "id": 2, 
    },

    ....
    ....

]
}

Используя ListAdapter, я пытаюсь присвоить эти значения списку. Вот Активность для этого ...

public class MBTExam extends ListActivity {

JSONObject result;
String exam_id;
JSONArray question_list_json;
ArrayList<String> question_list;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

    Bundle extras = getIntent().getExtras();
    try {
        result = new JSONObject(extras.getString("result"));
        exam_id = result.getString("exam_id");
        question_list_json = result.getJSONArray("questions");

        ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

        for (int i = 1; i <= question_list_json.length() ; i++) {

            HashMap<String, String> map = new HashMap<String, String>();
            JSONObject e = question_list_json.getJSONObject(i-1);

            map.put("id", new Integer(i).toString());
            map.put("question", e.getString("question"));
            map.put("A", e.getString("A"));
            map.put("B", e.getString("B"));
            map.put("C", e.getString("C"));
            map.put("D", e.getString("D"));

            mylist.add(map);
        }

        ListAdapter adapter = new SimpleAdapter(this, 
                mylist,
                R.layout.mbt_test,
                new String[] { "id", "question", "A", "B", "C", "D" },
                new int[] { R.id.question_no, R.id.question, R.id.A, R.id.B, R.id.C, R.id.D });

        setListAdapter(adapter);

    } catch (JSONException e) {
        Log.e("log_tag", "Error parsing data " + e.toString());
    }

}
}

Вот расположение строк для каждого вопроса

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="top" >

<TextView
    android:id="@+id/question_no"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignWithParentIfMissing="true" />

<TextView
    android:id="@+id/white_space"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/question_no"
    android:text="@string/white_space" />

<TextView
    android:id="@+id/question"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/white_space" />

<RadioGroup
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/question" >

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

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

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

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

</RelativeLayout>

а вот макет для "MBTExam"

<?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="match_parent"
android:gravity="top" >
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/android:list">
</ListView>
<Button
    android:id="@+id/submit"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="Submit"/>
</LinearLayout>

Кроме того, наряду с вопросами, я должен получить кнопку отправки в конце статьи. Пожалуйста, предложите мне необходимые изменения в коде моего макета.

Вот мой полный исходный код

Заранее спасибо.

1 Ответ

1 голос
/ 11 января 2012

SimpleAdapter, как и все хорошие реализации адаптера, перерабатывает / повторно использует представления в своей реализации getView.Вы видите неожиданный выбор радиокнопок, когда представление, у которого был выбор в его предыдущей позиции, повторно используется в другой позиции в ListView.

Вам нужно будет либо использовать пользовательский ViewBinder с существующим SimpleAdapter, либо создать свойсобственный класс Adapter для управления повторным использованием представлений.

Этот ответ на подобный вопрос кажется хорошим началом для начала:

Чтобы кнопка «Отправить» появилась в вашеммакет, присвойте своему ListView значение веса макета "1" в пределах вертикальной линии LinearLayout:

<?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="match_parent"
android:gravity="top"
android:orientation="vertical" >
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:id="@+id/android:list" />
<Button
    android:id="@+id/submit"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="Submit"/>
</LinearLayout>
...