0

我的项目正在使用 Recycler View 制作一个测验应用程序。单视图布局是一个带有一个 TextVIew 显示测验问题的 LinearLayout,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/linearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/txtQuiz"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TextView" />
</LinearLayout>

测验有 3 种类型:

  • Type0:多选单正确答案 -> 动态添加 RadioGroup 及其相关 RadioButtons。
  • Type1:多选多正确->动态添加CheckBoxes。
  • Type2:输入答案->动态添加EditView。

我设法成功添加了动态视图,但是每次滚动屏幕时,它们显示时的屏幕外视图,由代码动态添加的视图会被重复,并且有时顺序也会混乱(例如问题#1中的RadioGroup得到了复制并添加到问题#3等...)。

我得到了这样的 ViewHolder 构造函数:

 public ViewHolder(View itemView) {
            super(itemView);
            tvQuiz = (TextView) itemView.findViewById(R.id.txtQuiz);
            linearLayout = (LinearLayout) itemView.findViewById(R.id.linearLayout);
}

onBindViewHolder方法:

@Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Quiz quiz = quizzes.get(position);

        TextView textView = holder.tvQuiz;
        textView.setText(quiz.getQuiz());

        LinearLayout linearLayout = holder.linearLayout;

        if (quiz instanceof QuizType0) {
            RadioGroup radioGroup = new RadioGroup(linearLayout.getContext());


           // Type0: multiple choices and single correct answer 
           //-> dynamically adds RadioGroup and its relative RadioButtons.
            for (String s : ((QuizType0) quiz).getOptionsList()) {
                RadioButton radioButton = new RadioButton(linearLayout.getContext());
                radioButton.setText(s);

                linearLayout.setHasTransientState(true);
                radioGroup.addView(radioButton);
                linearLayout.setHasTransientState(false);
            }

            linearLayout.setHasTransientState(true);
            linearLayout.addView(radioGroup);
            linearLayout.setHasTransientState(false);
        }

           // Type1: multiple choices and multiple correct answers 
           // -> dynamically adds CheckBoxes.
        if (quiz instanceof QuizType1) {
            for (String s : ((QuizType1) quiz).getOptionsList()) {
                CheckBox checkBox = new CheckBox(linearLayout.getContext());
                checkBox.setText(s);

                linearLayout.setHasTransientState(true);
                linearLayout.addView(checkBox);
                linearLayout.setHasTransientState(false);
            }
        }

           // Type2: entry answer 
           // -> dynamically adds EditView.
        if (quiz instanceof QuizType2) {
            EditText editText = new EditText(linearLayout.getContext());

            linearLayout.setHasTransientState(true);
            linearLayout.addView(editText);
            linearLayout.setHasTransientState(false);
        }
    }

应用程序启动的那一刻是好的(截图链接)。

当我向下滚动并再次向上滚动时,问题 1 的 RadioGroup 被复制(屏幕截图链接)。

当我第三次尝试向下和向上滚动时,问题 #1 RadioGroup 得到了三次重复,这发生在所有通过动态方式添加的视图中,而不仅仅是问题 #1 中的一个(屏幕截图链接)。

4

0 回答 0