3

我正在尝试根据我通过循环获得的数组创建基本上是一张又一张重复的卡片列表。

但由于某种原因,将我的 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是在方法前面声明的 Array,仅包含几个字符串。并stack表现为一个列表。

我在bundle.putSerializable("title", questions[FAQNumber]);尝试添加时收到 OOB 错误questions[5](如果我questions[]包含 5 个值)。但我不明白这是怎么发生的,因为循环应该在FAQNumber等于 5 之前停止?

我对上述循环所做的只是将正确的问题传递给捆绑包,以便在按下卡片时,问题匹配。

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

4

2 回答 2

4

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

在实际单击按钮之前,不会调用OnClickListener'onClick(View v)方法。此时,它正在寻找现在等于 5的 FAQNumber 。这里要理解的关键是,当您放入FAQNumberonClick 方法时,它实际上会在单击时查找当前值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));
    }
});
于 2013-06-26T17:59:00.297 回答
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++;
};
于 2013-06-26T18:19:11.330 回答