新手。我正在编写一个测验应用程序 full code on Github加载带有四个参数的 arrayList
:
- 问题
- 图像(来自可绘制对象)
- 关键答案
- radioGroup(子数组列表)中呈现的可能答案
来自 strings.xml
如下
...
<string name="questionOne">Who is the "Modern Love" rock star singer?</string>
<string name="answerOne">David Bowie</string>
<string-array name="celebrityOne">
<item>Jaimie Hendrix</item>
<item>David Bowie</item>
<item>Jim Morrison</item>
<item>Elvis Presley</item>
</string-array>
...
下面是如何在 MainActivity
中加载参数(第三个参数是子数组列表)
ArrayList<Object> arrayList = new ArrayList<>();
loaddata()
...
public void loadData() {
arrayList.add(new Quiz(getResources().getString(R.string.questionOne),
getResources().getDrawable(R.drawable.celebrity_one_image, null),
new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.celebrityOne))),
getResources().getString(R.string.answerOne)));
arrayList.add(new Quiz(getResources().getString(R.string.questionTwo),
getResources().getDrawable(R.drawable.celebrity_two_image, null),
new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.celebrityTwo))),
getResources().getString(R.string.answerTwo)));
...
}
问题是在 N 次迭代之后,子数组列表开始重复自身(参见下图)。
另外,我认为问题的根源可能是在适配器中,其中子数组中的每个字符串都被分配给一个radioButton
;
void createRadioButtons(String[] arrayAnswer) {
if (mRadioGroup.getChildAt(0) != null)
return;
for (int i = 0; i < arrayAnswer.length; i++) {
mRadioGroup.addView(createRadioButtonAnswerAndSetOnClickListener(arrayAnswer[i]));
}
}
RadioButton createRadioButtonAnswerAndSetOnClickListener(String string) {
RadioButton radioButton = new RadioButton(mContext);
radioButton.setText(string);
radioButton.setOnClickListener(this);
return radioButton;
}
我的情况可能类似于 this但我没有静态字段,并且 arrayList 被初始化为新的,因此不需要 clear()
。
最佳答案
来自Documentation :
RecyclerView
仅创建显示动态内容的屏幕部分所需的 View 持有者以及一些额外的 View 持有者。当用户滚动列表时,RecyclerView
获取屏幕外 View 并将它们重新绑定(bind)到滚动到屏幕上的数据。
这意味着 RecyclerView
在滚动时重用已创建的 View 持有者(这就是数据重复的原因),并且您必须使用新数据重新填充 View 。因此,当 mRadioGroup.getChildAt(0) != null
时,您必须将 RadioButtons
文本更改为新数据,而不是从 createRadioButtons
方法返回来自arrayAnswer
。
关于java - 子数组列表输出在 n 个元素后重复自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60789117/