2013-02-12 84 views
0

注意:這不是滾動的常見問題,導致複選框丟失。android listview adapter複選框刷新

我有一個listview適配器與一個相關佈局(包含一個textview和一個複選框)作爲列表視圖行,我想這樣做當用戶點擊列表視圖行...然後複選框將切換。

我現在正在工作,但發生了什麼是複選框並沒有告訴我,它已經切換,直到我滾動屏幕上的行,然後回來。所以它看起來不夠爽快。我的猜測是我需要用複選框偵聽器明確地做其他事情。這裏是我的代碼:

  ViewHolder holder = null; 
     MainContactsListOnOff entry = listMaincontactslistOnOff.get(position); 
     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      convertView = inflater.inflate(R.layout.contact_rowonoff, null); 

     holder = new ViewHolder(); 
     holder.code = (TextView) convertView.findViewById(R.id.textView1onoff); 
     holder.name = (CheckBox) convertView.findViewById(R.id.checkBox1onoff); 
     holder.img = (ImageView) convertView.findViewById(R.id.imageView1onoff); 
     convertView.setTag(holder);  

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
    holder.code.setText(entry.getName().toString()); 
    if(entry.getOnoff()==1){ 
     holder.img.setImageResource(R.drawable.green); 
    } else { 
     holder.img.setImageResource(R.drawable.red); 
    } 
    convertView.setId(entry.getDevID()); 
    holder.name.setTag(entry); 
    holder.name.setChecked(entry.getChecked()); 

    convertView.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       RelativeLayout rl = (RelativeLayout) arg0; 
       CheckBox chkBx = (CheckBox) rl.getChildAt(1); 
       MainContactsListOnOff mclOO = (MainContactsListOnOff) chkBx.getTag(); 
       if(chkBx.isChecked()){ 
        mclOO.setChecked(false); 
       } else { 
        mclOO.setChecked(true); 
       } 

      } 

     }); 
     return convertView; 

回答

2

你只是忘了一行!

if(chkBx.isChecked()){ 
       mclOO.setChecked(false); 
      } else { 
       mclOO.setChecked(true); 
      } 
chkBox.setChecked(!chkBx.isChecked()); //<-----Add this line to update the box state! :) 

您只修改標籤而不是複選框。這就是爲什麼當它重新加載時,它是正確的。

(彈跳:可以簡化上述兩行:

chkBox.setChecked(!chkBx.isChecked()); 
mclOO.setChecked(chkBox.isChecked()); 

+0

聽者還是在外面? – milkboneUnderwear 2013-02-12 19:44:59

+0

當然。 – Edison 2013-02-12 20:04:05

0

我實現類似的功能 - 在那裏我有ListView中的行中的複選框。所以,有這個東西對付三個地方:

的xml文件: 選中複選框作爲row.xml「可聚焦」(在我的情況是這樣的文件名)。

<CheckBox 
    android:id="@+id/on_off" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:focusable="false" /> 

將接收復選框,點擊的活動: 使活動實施OnCheckedChangeListener。然後,你需要實現onCheckedChanged()方法。

@Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

     // here you receive clicks 
      // you can perform your desired action 

    } 

現在,問題是如何將複選框與監聽器(這是listview活動性)相關聯。那麼,無論你將xml複選框綁定到java中的CheckBox,設置它的

就我而言,我有一個自定義View類,它代表一行listview。我將該活動傳遞給該類的構造函數,然後在構造函數中將其作爲 CheckedChangedListener用於實現OnCheckedChangeListener的活動。

public class ListRow extends RelativeLayout { 

    // other elements 
    ... 
    private CheckBox OnOff; 

    public ListRow(Context context, ...) { 
     super(context); 


     LayoutInflater inflater = 
       (LayoutInflater)  context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     inflater.inflate(R.layout.list_row, this, true); 
     ... 

     OnOff = (CheckBox) findViewById(R.id.on_off); 
     OnOff.setOnCheckedChangeListener((OnCheckedChangeListener) context); 

    } 
}