2012-07-03 50 views
-1

這是我的情況。
我有什麼:一個帶有複選框(稱爲「checkAll」)的活動,位於自定義元素列表的右上角和下方:TextView和複選框。
我想要什麼:在checkAll上clik時,檢查列表中每個項目的所有複選框。
問題:只有當列表中的所有項目都可以在屏幕上看到時,所有的作品才能正常工作。當我有很多元素的列表(例如20),然後當點擊checkAll我的應用程序崩潰。 logcat的說我:NullPointerException異常上線
在Android中有很多元素的列表中的CeckAll按鈕

 CheckBox checkBoxInTheItemList = (CheckBox) 
        mList.getChildAt(i).findViewById(R.id.checkBox); 


這是我的函數:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.list_layout_select_friend); 
    checkAll =(CheckBox)findViewById(R.id.checkBoxAll);  
    checkAll.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      if((checkAll.isChecked())){ 
      for(int i=1;i<peopleSize;i++){//for each element of my array of Person 
      mList=(ListView) findViewById(R.id.list); //This is the id of my List 
               //in the list_layout_select_friend 
       CheckBox checkBoxInTheItemList = (CheckBox) 
       mList.getChildAt(i).findViewById(R.id.checkBox); //i try to get 
          //for each item of the List the relative checkBox.      
     checkBoxInTheItemList.setChecked(true);//Now i checked the checkBox 
      } 
    }   
    } 
    }); 

} 

編輯:這是我的適配器蒙山也是方法getView

​​

我該如何避免這個問題? 我怎樣才能檢查一個大列表與隱形元素的所有複選框?

回答

1

爲了實現這一點,您需要了解ListView如何工作,即查看回收。在Android中創建列表時,動態創建視圖。當您上下滾動時,列出屏幕上的項目需要清除其數據並刪除下一項的信息。這發生在您的列表適配器的getView方法中(它由方式,會對你發佈很有幫助)。我相信這是您空指針異常的原因。 getChildAt方法只能返回可見列表項,因爲其他項目目前不存在。第一個可見的項目將是索引0.因此,即使您的列表可能有20個項目,如果只有5個可見,getChildAt只能返回5個,並且要求超出界限的視圖可能會導致此異常。

我會接近你的項目的方式是通過一個數據結構來記錄你的列表項目和複選框的狀態。一個非常簡單的例子就是布爾數組,其中真/假值對應於如果該框被選中。當調用getView()時,可以使用position參數作爲數組的索引,並根據此選擇或取消選中該框。 (無論如何,如果你正在回收你的視圖,你可能應該這樣做)如果按下全部檢查按鈕,那麼只需使數組的每個元素爲真。

一些示例代碼可以幫助您。

private boolean[] isCheckedArray; //Maintains the checked state of your 

... //At some point, probably onCreate or whenever you get your data, initialize your array. If nothing every starts checked off, initialize the whole array to false 

checkAll.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View arg0){ 
     for(int i=1;i<peopleSize;i++) 
      isCheckedArray[i] = true;  
    } 
}); 

... 
//And finally, in your getView function 
@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    ... 
    myCheckBox.setChecked(isCheckedArray[position]) 
    ... 
} 

希望這會有所幫助。我肯定會考慮在Android中查看回收,因爲這是一個關鍵概念,並且處理好它會爲您節省大量時間和頭痛。祝你好運。

+0

感謝馬特對不可見項目的解釋。現在我在我的辦公室。當我在家時,我會嘗試你的建議,那就是我尋找的東西(我希望:D)。我編輯我的問題白我的適配器的代碼,你可以看看,如果在getView有一些錯誤或不完整?謝謝:) –

+0

好吧馬特,我添加行myCheckBox.setChecked(isCheckedArray [位置])和一些代碼的變化。謝謝!!!! –