2010-10-12 94 views
5

我有一個Android ListView其項目有一個複選框。複選框更改值兩次

該複選框默認被選中。一旦未選中,它應該從列表中刪除。

的問題是,onCheckedChanged是被解僱了兩次:當我點擊複選框取消選中它(與isCheckedfalse)後,我刪除的項(含isCheckedtrue)。

這是我ArrayAdapter的相關代碼:

public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.item, parent, false); 
     holder = new ViewHolder(); 
     holder.check = (CheckBox) convertView.findViewById(R.id.check); 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    final Object item = this.getItem(position); 
    holder.check.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (!isChecked) { 
       remove(item); // This somehow calls onCheckedChanged again 
      } 
     } 
    }); 
    return convertView; 
} 

我在做什麼錯?

+0

remove()方法做了什麼,因爲這不是'ListAdapter'上的方法? – CommonsWare 2010-10-12 11:48:03

+0

我正在使用ArrayAdapter。根據Android源代碼,remove方法從數組中刪除項目並通知數據已更改。 – hpique 2010-10-12 11:54:24

回答

0

我遇到同樣的問題。

經過一番研究,我發現在RadioGroup中有一個類似於setCheckChangeListener的行爲。

標記會弄亂事情,看起來像一個錯誤。

我的解決方法是將標記設置爲null在偵聽器的末尾它爲我工作。

private OnCheckedChangeListener checkBoxitemClickListener = new OnCheckedChangeListener() { 

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 


     if(isChecked) 
     {    
      //do smth 
     }else 
     { 
      //do smth 
     } 

     buttonView.setTag(null);       
    } 
}; 

如果您需要後更新您的ListView,不要忘記調用「notifyDataSetChanged」你的適配器上。

乾杯

5

我遇到同樣的問題,這似乎是一個Android的bug onCheckChanged方法的這兩次執行。

我的解決方案:實施onClickListener,而不是onCheckedChangedListener

事情是這樣的:

private final class CheckUpdateListener implements OnClickListener { 

    private Group parent; 
    private boolean isChecked; 

    private CheckUpdateListener(Group parent) { 

     this.parent = parent; 

    } 

    @Override 
    public void onClick(View box) { 
     this.isChecked = !parent.isChecked(); 

     parent.setChecked(isChecked); 

     notifyDataSetChanged(); 

    } 

} 
+0

是的,我認爲聽取onCheckedChange是矯枉過正,而不是在大多數情況下是正確的。但對我而言,基本問題是要獲得正確的觀點,即視圖與所查看的數據對象不同。 – rwst 2014-02-01 10:12:31

2

我也有類似的問題,只是解決了它正確而無需避免使用意OnCheckedChangeListener

問題代碼

holder.someCheckBox.setChecked(false); 
holder.someCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { 
     ... 
    } 
}); 

注意我設置檢查狀態之前,我設置的聽衆,這是爲了防止監聽器發射的創作。

但是,只有在適配器被強制重新創建或通過使用notifyDataSetChanged後,監聽器纔開始啓動正確檢查事件兩次。

解決方案

清除聽者之前設置檢查狀態,即使是在創造在這裏。

holder.someCheckBox.setOnCheckedChangeListener(null); 
holder.someCheckBox.setChecked(false); 
holder.someCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { 
     ... 
    } 
}); 

現在任何殘餘聽衆不會被設置的複選框的初始值時燒製。