2013-10-04 42 views
8

我有一個複選框一個ListView:onCheckedChanged發射多次,列表視圖用複選框

  1. Oncheckedchanged(..)當列表視圖
  2. OncheckedChanged(..)用戶選中/清除項目再次打電話時,用戶通過onItemClick(.....)
  3. 點擊列表項被稱爲

這是一個已知的問題?如何區分事件。

public View getView(int position, View convertView, ViewGroup parent) { 

ViewHolder viewHolder = null; 
if (convertView == null) { 
    LayoutInflater inflator = context.getLayoutInflater(); 
    convertView = inflator.inflate(R.layout.row, null); 
    viewHolder = new ViewHolder(); 
    viewHolder.text = (TextView) convertView.findViewById(R.id.label); 
    viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.check); 
    viewHolder.imageview= (ImageView) convertView.findViewById(R.id.imageView1); 
    viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag. 
        list.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state. 
       } 
      }); 
    convertView.setTag(viewHolder); 
    convertView.setTag(R.id.label, viewHolder.text); 
    convertView.setTag(R.id.check, viewHolder.checkbox); 
    convertView.setTag(R.id.imageView1, viewHolder.imageview); 

} else { 
    viewHolder = (ViewHolder) convertView.getTag(); 
} 
viewHolder.checkbox.setTag(position); // This line is important. 
viewHolder.imageview.setTag(position); 
viewHolder.text.setText(list.get(position).getName()); 
viewHolder.checkbox.setChecked(list.get(position).isSelected()); 


//  change the default-image here 
if(list.get(position).getcontact_id()==5) 
{ 
    viewHolder.imageview.setImageResource(android.R.drawable.ic_dialog_map); 
}... 
.. 


return convertView; 
} 

編輯

onCheckedChanged()時沒有選中的項被稱爲

  1. 一旦和用戶點擊複選框
  2. 如果列表中包括3項,當用戶點擊上的任何其他物品,onItemclick()被調用和onCheckedChanged()進行燒成3倍(=無:在列表視圖項目)
+0

這將會是巨大的,如果我們能看到你的代碼... –

+0

其代碼 - 的一部分。 onclickitem()或customadapter? – user755

+0

我想你在哪裏設置你的'OnCheckChangedListener'會很高興地看到的地方... – Darwind

回答

6

這是預期的行爲:

  • onCheckedChanged(CompoundButton buttonView, boolean isChecked)被稱爲爲每個項目,每當他們選中/取消。 Android已決定爲您追蹤所有項目狀態,並在每次更改時調用您的每個項目。使用isChecked參數,您可以區分發生的情況。

  • onItemClick()只要其中一個項目被點擊 - 不一定是項目內的複選框,而是某處。通常情況下,這個項目會被選中 - 同樣,並不總是如此。

  • 如果您需要知道哪個項目實際上是從列表視圖中選擇,請使用OnItemSelectedListener.onItemSelected()。這是獲取選擇(整個項目)的人。

順便說一句:你不需要prpg手動複選框的行爲。檢查/取消選中並在框中繪製勾號由Android完成。一旦你知道選擇了哪一個,你只需要獲得檢查狀態。因此,根據我所見,完全沒有必要執行該操作。

+1

+1好的答案,因爲它是正確的...但Android已經決定錯誤!它的愚蠢和不一致......其他組件通過代碼(進度條或至少將其引入偵聽器)來補償值更改,其他組件如Spinner,onItemSelected回調也會補償選擇所選節點。 – TacB0sS

13

更換onCheckChangeListener到onClickListener。

的checkChanged會被調用兩次,因爲它會被調用,當你調用setChecked()方法,當你點擊複選框。

+0

這是更好的建議! – TacB0sS

+2

但如果你改變檢查狀態沒有點擊,就像用簡單的小拖動,這將不會被調用。你可以檢查你自己。 –