我正在尝试创建一个基本上是一个接一个重复的卡列表,基于我通过循环的数组。
出于某种原因,在循环中设置我的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
表现为列表。
我在bundle.putSerializable("title", questions[FAQNumber]);
尝试添加questions[5]
(如果我的questions[]
包含5个值)时收到OOB错误。但我不明白这是怎么发生的,因为循环应该在FAQNumber
等于5之前停止?
我正在尝试使用上面的循环将正确的问题传递给捆绑包,这样当按下卡片时,问题就会匹配。
无论如何,任何帮助都表示赞赏!
答案 0 :(得分:4)
FAQNumber似乎是在for-loop之外而不是在inside之外定义的。这意味着它在循环完成后仍然存在......这是故意的吗?如果questions
中有5个项目,那么在循环终止后,FAQNumber将等于5(由于最后FAQNumber++
)。
在实际点击按钮之前,不会调用OnClickListener
的{{1}}方法。目前,它正在寻找FAQNumber ,现在等于5 。这里要理解的关键是当你将onClick(View v)
放入onClick方法时,实际上它会在点击时查找FAQNumber
的当前值,而不是当时你定义了这个方法。你在这一行获得FAQNumber
的原因不是因为你在循环时发生了错误,而是因为按钮的点击行为位于此处,所以这就是抛出错误的地方。你的循环实际上执行得很好。
相反,您将要将FAQNumber存储为您点击的视图上的实例变量,如下所示:
OutOfBoundsException
答案 1 :(得分:0)
除了@ hatboysam的答案之外,我还通过改变一段时间来实现它:
while(FAQNumber < questions.length){
final int i = FAQNumber;
final FAQCard FAQ = new FAQCard(questions[FAQNumber], answers[FAQNumber]);
FAQ.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Create a new bundle to pass to the browser
Bundle bundle = new Bundle();
// Inform which feed item was selected
bundle.putSerializable("title", questions[i]);
bundle.putSerializable("position", i);
// Start the new activity and pass on the bundle
startActivity(new Intent(getActivity().getBaseContext(), QuestionAnswer.class).putExtras(bundle));
}
});
stack.add(FAQ);
FAQNumber++;
};