2013-09-05 64 views
2

我創建了一個帶有相當複雜的子項xml的ExpandableListView。它包含一個TextView,一個複選框和一個EditText。 這裏是複選框部分:ExpandableListView子項的CheckBox被隨機檢查

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="55dip" 
       android:orientation="horizontal" 
       android:stretchColumns="0"> 
    <TableRow> 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" 
    > 
    <TextView 
     android:id="@+id/lblListItem" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textSize="14dip" 
     android:paddingTop="2dp" 
     android:paddingBottom="2dp" 
     android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"/> 
    <CheckBox 
     android:id="@+id/cboxIsRel" 
     android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 

    </CheckBox> 
    </TableRow> 
    </TableLayout> 

如果我入住的第一個項目,每一個第5項也被檢查組(如果選擇第二個,然後第6被選中)。

爲什麼他們也被選中?

UPDATE:
在getChildView方法我有這樣的代碼:

如果(convertView == NULL){ LayoutInflater infalInflater =(LayoutInflater)this._context .getSystemService(Context.LAYOUT_INFLATER_SERVICE) ; convertView = infalInflater.inflate(R.layout.expandable_list_item,null); }

TextView txtListChild = (TextView) convertView 
    .findViewById(R.id.lblListItem); 

txtListChild.setText(childText); 

如果我不使用convertView檢查,那麼該複選框不重複使用,但也如果我在滾動出所選擇的複選框被選中。

回答

3

這是因爲回收的意見。

確保在適配器上,bindView()或getView()方法將複選框設置爲選中狀態。

編輯:

的ListView重用的意見,以提高性能,所以在你的情況下,第一個項目被選中,那麼同樣的觀點是在第5子使用,所以它爲什麼還檢查。

因此,爲了防止發生這種情況,您必須保存哪個位置被檢查,並且您的getChildView()方法應該根據保存的值檢查/取消選中複選框。

這樣,你檢查第一個項目,然後你滾動和視圖被回收到第五個孩子,適配器將調用getChildView的位置5,你會檢查它是否被檢查。由於它沒有被選中,你可以在複選框上調用setchecked(false),它將顯示爲未選中狀態。

+0

我不太瞭解你的建議。在適配器中,我有一個getChildView,但它沒有設置任何複選框的狀態。你能多解釋一下嗎? – Nestor

+0

@Nestor查看新編輯 –

+0

我是否有責任保存我的複選框的選中狀態?說,在一個HashMap?沒有任何內置的支持嗎? – Nestor

相關問題