2013-02-12 112 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); 

    } 
}