注意:这不是滚动的常见问题,导致复选框丢失。
我有一个listview适配器,其中包含一个relativelayout(包含textview和一个复选框)作为listview行,我想在用户点击listview行时这样做...然后复选框将切换。
我现在几乎可以使用它,但是发生的事情是复选框没有显示它已经切换,直到我从屏幕上滚动行然后再回来。所以它似乎没有正确刷新。我的猜测是我需要使用复选框监听器明确地执行其他操作。这是我的代码:
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;
答案 0 :(得分: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());
)
答案 1 :(得分: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);
}
}