android - 循环内的 OnClickListener 抛出 IndexOutOfBounds 异常

标签 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 的行为类似于 List。

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

我在上面的循环中尝试做的就是将正确的问题传递给 bundle,这样当一张卡片被按下时,问题就会匹配。

无论如何,我们将不胜感激!

最佳答案

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

OnClickListeneronClick(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/

相关文章:

javascript - 使用选择器单击时记录

Android - 将字符串传递给 Asynctask?

android - 使用 ContactsContract,查询匹配的姓名或电子邮件

java - 使用 for 循环或 while 循环进行迭代?

java - 将 4 个 for 循环变成 1 个

jquery - onclick ="return confirm(' ' )"working with $(' .class').click(function () {});

Javascript div show hide onclick with image sprite

Android - 在 AsyncTask 中显示警报对话框

Android List<T> 等价物

javascript - 有人可以告诉我为什么这段代码无法运行吗?