2013-06-26 48 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'中被認爲是一個常量。 –