2010-09-13 116 views
1

我正在建立一個列表和列表包含每個聯繫人 複選框來選擇哪一個修改例如,問題是 當列表變得比手機屏幕長,滾動是 有效;當我選擇一個複選框時,第二個會自動在列表底部選擇 。自動選擇列表視圖中的複選框 - android

問題是自動選擇第二個複選框; 請讓我知道我該如何解決?

下面

是代碼我使用getView方法

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


    View row = converView; 
    if(row == null){ 
    LayoutInflater inflater = getLayoutInflater(); 
    row = inflater.inflate(R.layout.edit, parent, false); 
    } 

    TextView label = (TextView)row.findViewById(R.id.label); 
    label.setText(items[position]); 

    CheckBox cb = (CheckBox)row.findViewById(R.id.del); 

    ImageView icon = (ImageView)row.findViewById(R.id.icon); 
    icon.setImageResource(images.get(position)); 

    Log.i("Pos", ""+position); 


    return row; 
    } 
} 

回答

5

的問題是,列表重用視圖(因此convertView論點getView)。 在你的代碼中,如果你得到一個非空的convertView,你必須將它的複選框選中狀態更改爲與新內容相關的內容。

假設view1先與id1關聯,然後檢查它。 然後,您滾動和view1被轉換爲顯示ID爲10.但由於視圖沒有重新創建,它仍然會有ID爲1的項目中的複選框狀態。

所以基本上解決方案是存儲某個地方項目選擇和我們的getView方法,你會做

cb.setChecked(isItemChecked(position)); 

而且你必須實現isItemChecked(INT位置);

低效的,但工作的實施方法是,使用布爾數組在您的活動,讓我們說

boolean[] itemChecked; 

然後在getView,您設置複選框選中一個監聽器(必須做出位置最終這個上班)。您還可以使用數組設置選中的狀態。

cb.setOnCheckedChangeListener (new OnCheckedChangeListener() { 
    public void onCheckedChanged (CompoundButton btn, boolean isChecked) { 
    itemChecked[position] = isChecked; 
    } 
}); 

cb.setChecked(itemChecked[position]); 

但同樣,使用數組是也許不是最有效的實施,特別是如果你在你的列表中元素的數量巨大。

+0

非常感謝你Julien,它的工作,我只是改變了一件事,我改變了布爾值[] itemChecked;到布爾值itemChecked [] = new boolean [100];因爲它給了我空指針異常... – Waqar 2010-09-13 20:51:10

0

Yyou還可以使用SparseBooleanArray它允許您使用列表中的位置的關鍵

0

工作正常,我

public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 

     final ViewHolder holder; 
     final Season season = (Season) getGroup(groupPosition); 
     if (convertView == null) { 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = vi.inflate(R.layout.season, parent, false); 
      holder = new ViewHolder(); 
      holder.title = (TextView) convertView.findViewById(R.id.season_title); 
      holder.checkBox = (CheckBox) convertView.findViewById(R.id.season_check_box); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.title.setText(season.getTitle()); 
     holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       season.setChecked(isChecked); 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

     holder.checkBox.setChecked(season.isChecked()); // position is important! Must be before return statement! 
     return convertView; 
    } 

    protected class ViewHolder { 
     protected TextView title; 
     protected CheckBox checkBox; 
    } 
相關問題