抛出IndexOutOfBounds异常的循环内的OnClickListener

时间:2013-06-26 17:33:05

标签: android for-loop onclick indexoutofboundsexception

我正在尝试创建一个基本上是一个接一个重复的卡列表,基于我通过循环的数组。

出于某种原因,在循环中设置我的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之前停止?

我正在尝试使用上面的循环将正确的问题传递给捆绑包,这样当按下卡片时,问题就会匹配。

无论如何,任何帮助都表示赞赏!

2 个答案:

答案 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++;
};