我正在尝试创建基本上是一张接一张重复的卡片列表,基于我通过循环获得的数组。
但出于某种原因,在循环内设置我的 OnClickListener 会导致 OOB 异常,但据我所知,这不应该是这样,所以我很感激被指出了正确的方向。
我的循环:
for(FAQNumber = 0; FAQNumber < questions.length; FAQNumber++){
stack.add(new FAQCard(questions[FAQNumber], answers[FAQNumber]));
(stack.get(FAQNumber)).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = new Bundle();
bundle.putSerializable("title", questions[FAQNumber]);
bundle.putSerializable("position", FAQNumber);
startActivity(new Intent(getActivity().getBaseContext(), QuestionAnswer.class).putExtras(bundle));
}
});
}
questions
是在方法前面声明的数组,仅包含几个字符串。 stack
的行为类似于 List。
我在 bundle.putSerializable("title", questions[FAQNumber]);
尝试添加 questions[5]
时遇到 OOB 错误(如果我的 questions[]
包含 5 个值)。但我不明白这是怎么发生的,因为循环应该在 FAQNumber
等于 5 之前停止?
我在上面的循环中尝试做的就是将正确的问题传递给 bundle,这样当一张卡片被按下时,问题就会匹配。
无论如何,我们将不胜感激!
最佳答案
FAQNumber 似乎是在 for 循环之外而不是内部定义的。这意味着它在循环完成后继续存在......这是故意的吗?如果 questions
中有 5 个项目,则在循环终止后 FAQNumber 将等于 5(由于最后一个 FAQNumber++
)。
OnClickListener
的onClick(View v)
方法只有在按钮被实际点击后才会被调用。此时,它正在寻找 FAQNumber 现在等于 5。这里要理解的关键是,当您将 FAQNumber
放入 onClick 方法时,它实际上会在点击时查找 FAQNumber
的当前值,而不是在您定义方法时。您在这一行收到 OutOfBoundsException
的原因不是因为循环时发生了错误,而是因为按钮的点击行为位于此处,所以这是抛出错误的地方。您的循环实际上执行得很好。
相反,您需要将 FAQNumber 作为实例变量存储在您正在单击的 View 中,如下所示:
for(int i = 0; i < questions.length; i++) {
stack.add(new FAQCard(questions[i], answers[i]));
// Replace YourViewClass with whatever you're getting off the stack
YourViewClass obj = (stack.get(FAQNumber));
obj.setFaqNumber(i); // You'll need to add this method
obj.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Bundle bundle = new Bundle();
// You'll need to add the getFaqNumber() getter as well
bundle.putSerializable("title", questions[getFaqNumber()]);
bundle.putSerializable("position", getFaqNumber());
startActivity(new Intent(getActivity().getBaseContext(), QuestionAnswer.class).putExtras(bundle));
}
});
关于android - 循环内的 OnClickListener 抛出 IndexOutOfBounds 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17326766/