2013-06-26 76 views
3

我想创建什么基本上重复一个接一个,基于从一个数组我有一个循环卡的列表。OnClickListener内循环抛出IndexOutOfBounds异常

由于某些原因,虽然在循环内设置我的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]);上收到OOB错误,当它试图添加questions[5](如果我的questions[]包含5个值)。但我不明白这是怎么发生的,因为循环应该在FAQNumber等于5之前停止?

所有我想要做的上述循环是传递正确的问题到捆绑,以便当一张卡被按下时,问题匹配。

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

回答

4

FAQNumber似乎是在for-loop之外而非inside之外定义的。这意味着它在循环完成后继续存在......这是故意的吗?如果questions中有5个项目,则循环终止后FAQNumber将等于5(由于最后的FAQNumber++)。

OnClickListeneronClick(View v)方法直到实际点击按钮才被调用。目前,它正在寻找FAQNumber ,它现在等于5。这里要理解的关键是,当您将FAQNumber放入onClick方法时,它将实际发挥作用,并在点击时查找当前值FAQNumber,而不是在您定义方法时。你在这条线上得到OutOfBoundsException的原因不是因为错误发生在你循环的时候,而是因为按钮的点击行为在这里,所以这是错误发生的地方。你的循环实际上执行得很好。

相反,你会想FAQNumber存储为上的观点的一个实例变量你一下,像这样:

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)); 
    } 
}); 
+1

得到它的工作,谢谢!从来不知道OnClicks是这样设置的,我认为它们被设置为稍后触发的视图 – whitfin

+1

它们被设置为稍后触发,但是,事件处理程序中的代码在点击时执行。 – Simon

+1

@hatboysam另外,它在外面定义的原因是因为Eclipse抱怨它需要是“final”,当然它不能被循环迭代。 – whitfin

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++; 
}; 
+1

这里重要的不是'while',而是'int i'是循环和final的本地对象,因此在'OnClickListener'中被认为是一个常量。 –