我的项目正在使用 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 中的一个(屏幕截图链接)。