2015-05-17 45 views
0

我想製作一個列表視圖,其中一個項目包含一個文本和一個複選框,對於複選框偵聽器,我想使用onCheckedChange。我不明白這個監聽器的行爲,因爲當我從列表頂部檢查一個項目,然後向下滾動並返回到頂部時,我的複選框狀態未被選中,但如果我使用列表進行更多操作,它似乎可以工作一般。我不明白,如果我使用不合適的onCheckedChangeListener或它是一個普遍的問題。 因此,這裏是我的代碼的一部分:ListView中的OnCheckedChangeListener

public View getView(int position, View convertView, ViewGroup parent) { 
PickerItemDto item = items.get(position); 

if (convertView == null) { 
    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    convertView = mInflater.inflate(R.layout.picker_item, null); 

    ViewHolder viewHolder = new ViewHolder(convertView); 
    viewHolder.checkboxChange= new OnCheckboxChange(); 
    viewHolder.cbSelectFriend.setOnCheckedChangeListener(viewHolder.checkboxChange); 

    convertView.setTag(viewHolder); 
} 
    ViewHolder holder = (ViewHolder) convertView.getTag(); 

    holder.tvName.setText(item.getName()); 
    holder.cbSelectFriend.setChecked(item.isChecked()); 
    holder.cbSelectFriend.setTag(item);} 

private class OnCheckboxChange implements CompoundButton.OnCheckedChangeListener { 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     CheckBox cb= (CheckBox) buttonView; 
     PickerItemDto item = (PickerItemDto) cb.getTag(); 

     item.setChecked(isChecked); 
    }} 

雖然我測試至今,這個問題是因爲onCheckboxChanged被多次調用,當我scoll列表和器isChecked價值在於「假」的,也就是說,我已經檢查過。 我知道我可以使用onClickListener,但我需要onCheckBoxChange,因爲我想使用只有此偵聽器可用的庫。

任何人都可以解釋我的錯在哪裏嗎?由於

+0

你確定'setChecked'被分配您提供的參數值? – Blackbelt

+0

是的。問題是,當我檢查一個項目,在偵聽器中設置item.setChecked(true),但是當我滾動onCheckedChanged再次調用相同的元素,我檢查,但現在isChecked參數是false ..可能這個事件不是爲這種用法而設計的? –

回答

0

onCheckboxChanged多次調用滾動時,因爲每一次的ListView重用視圖你塞汀新的檢查值:

holder.cbSelectFriend.setChecked(item.isChecked()); 

您可以修復它,如果你將在getView方法創建每次新OnCheckboxChange(現在你創建新OnCheckboxChange只有當convertView == null):

if (convertView == null) { 
    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    convertView = mInflater.inflate(R.layout.picker_item, null); 

    ViewHolder viewHolder = new ViewHolder(convertView); 
    convertView.setTag(viewHolder); 
} 

ViewHolder holder = (ViewHolder) convertView.getTag(); 
holder.cbSelectFriend.setOnCheckedChangeListener(new OnCheckboxChange()); 
holder.cbSelectFriend.setChecked(item.isChecked()); 

但它不是最佳的方式。 更加簡單和乾淨的方法就是使用OnItemClickListener

+0

如果我每次創建一個新的點擊偵聽器,這是相同的行爲。此外,我不能使用onItemClickListener,因爲在項目單擊我有另一個事件 –

+0

你是否嘗試我的例子,它不工作?你能顯示最終的代碼嗎? 如果您不能使用onItemClickListener,則可以使用cbSelectFriend.setOnClickListener()。但是,您應該每次都在getView方法中設置新的onClickListener。 – gildor

1

簡單回答你的問題是更換

holder.cbSelectFriend.setChecked(item.isChecked()); 
holder.cbSelectFriend.setTag(item); 

holder.cbSelectFriend.setTag(item); 
holder.cbSelectFriend.setChecked(item.isChecked()); 
相關問題