2012-05-09 76 views
0

我有都有一個複選框,然後在它接觸填充的ListView我用複選框爲每個聯繫人列表的活動。我有兩個主要問題源於我的問題。如何檢查所有複選框在ListView從一個複選框

  1. chkbox_foo不在listview中,而chk_bar在裏面。 chk_foo工作,但被初始化後chk_bar有關任何導致應用程序崩潰。另外,如果我創建一個chkbox_bar setOnCheckedChangeListener,這將導致應用程序崩潰也。有誰知道爲什麼會發生這種情況,我該如何解決這個問題?

    btn_foo = (Button) findViewById(R.id.btn_foo); 
    barList = (ListView) findViewById(R.id.lv_barList); 
    chk_foo = (CheckBox) findViewById(R.id.cb_foo); 
    chk_bar = (CheckBox) findViewById(R.id.cb_bar); 
    
    // set checkboxes state as false at beginning 
    chkboxAllVisible = false; 
    chkboxSingleChk = false; 
    
    chk_foo.setChecked(chkboxAllVisible); 
    chk_bar.setChecked(chkboxChk); <---App crashes here 
    
    // Outside of listview checkbox 
    chk_foo.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 
    
        public void onCheckedChanged(CompoundButton buttonView, 
          boolean isChecked) { 
         Log.d(TAG, "checkbox changed " + isChecked); 
         if(isChecked){ 
          chkboxAllVisible = true; 
          chk_bar.setChecked(isChecked); <---app crashes here too 
         } 
        } 
    }); 
    // Outside of listview checkbox 
    chk_bar.setOnCheckedChangeListen... <---app crashes here also 
    
+1

我想chk_bar是空的...粘貼崩潰日誌 – Ronnie

回答

0

chk_bar可能是零。如果複選框位於列表視圖中,則不能在主佈局上調用findViewByID。你必須在它所在/包含的佈局上調用它,這將是listview項目。

這就是說,你不必這樣做。如果你與複選框有聯繫,我猜你正在使用某種自定義適配器?如果是這樣,那麼這很容易。我也假設你正在跟蹤的項目/接觸是否已經被選中(如果沒有,你需要實現反正,見下面的教程)

在您的自定義適配器的getView,而生成視圖,您需要查看數據對象,如果IsChecked值爲true,則選中該複選框。

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    //Inflate your view 
    //View listViewLayout = ... 

    //Here is where you get the reference to the checkbox 
    Checkbox chkBox = (CheckBox)listViewLayout.findViewById(R.id.cb_bar); 

    //Get the data object from whatever your source is (maybe an array list?) 
    SomeObj curObj = (SomeObj)listOfItems.get(position); 

    chkBox.setChecked(curObj.IsChecked); 
} 

這裏是如何實現列表視圖自定義適配器完全教程: http://www.ezzylearning.com/tutorial.aspx?tid=1763429&q=customizing-android-listview-items-with-custom-arrayadapter

一旦你的工作,剩下的就是簡單:

當用戶點擊主複選框:

  1. 重新生成項目列表,但強制所有複選框值爲true。
  2. 呼叫adapter.notifyDataSetChanged()

當你調用notifyDataSetChanged()的列表視圖將重新繪製本身(如果它認爲源項目已在事實上被改變顯示方式:。notifyDataSetChanged example

當它重新生成列表視圖時,它將遍歷您傳入的源項目,並且由於您重新生成了列表並將所有項目標記爲「IsChecked」(或任何變量名稱),它將檢查每個複選框。

+0

Aaaah,我明白你在說什麼。謝謝您的意見!我在錯誤的地方列表中的複選框! – SpicyWeenie

1

當你的「主」複選框,用戶點擊你需要通過綁定到你的ListView列表進行迭代。然後,通過單獨訪問每一行,您可以標記每行的複選框。

如果你想有一個具體的例子,請張貼代碼爲您的ListView。

相關問題