我的问题与this post非常相似。在我的ListView的每一行中,我都有一个带有监听器的复选框。监听器更新数据库行。
@Override
public void bindView(View v, Context context, Cursor c) {
TextView tvA = (TextView) v.findViewById(R.id.adi_tv_activity);
CheckBox cb = (CheckBox) v.findViewById(R.id.adi_cbox);
tvA.setText(c.getString(c.getColumnIndex("name")));
final long id = c.getLong(c.getColumnIndex("_id"));
final Context ctx = context;
cb.setOnCheckedChangeListener(new OnCheckedChangeListener(){
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
ObjDBF dbf = new ObjDBF(ctx); //Object thet update db
if(isChecked) {
dbf.tbActivitiesUpdateState(id, true);
} else {
dbf.tbActivitiesUpdateState(id, false);
}
}
});
if (c.getBoolean(c.getColumnIndex("state"))) {
cb.setChecked(true);
} else {
cb.setChecked(false);
}
}
我有两个问题。
对于有问题的滚动问题,我想每次更新db时都使用adapter.changeCursor,但对于第二个问题,它会导致循环。
我也尝试使用一个使用数组,如上面链接帖子的第二个答案,但它使用方法getView od adapter,我有一个cursorAdapter并在newView和bindView中工作
我该如何解决这个问题?
编辑:auselen解决方案有效但它会创建并销毁很多听众,还有其他更有效的解决方案吗?
答案 0 :(得分:3)
为避免在侦听器上触发回调,您应该cb.setOnCheckedChangeListener(null)
取消注册现有回调,然后再次设置cb.setChecked(c.getBoolean(c.getColumnIndex("state")))
,然后再设置cb.setOnCheckedChangeListener()
。
但是,您应该考虑使用OnCheckedChangeListener
的更好方法,因为您最终会创建超出需要的侦听器。
答案 1 :(得分:0)
private SparseBooleanArray bolarray;
public class ViewHolder{
CheckBox checked_displayName;
int contact_id;
String displayName;
boolean isChecked=false;
}
public void bindView(View v, Context context, Cursor cursor)
{
ViewHolder viewHolder=new ViewHolder();
viewHolder.checked_displayName=(CheckBox)
v.findViewById(R.id.checked_displayName);
viewHolder.displayName=cursor.getString(cursor.getColumnIndex(PROJECTION[0]));
viewHolder.checked_displayName.setText(viewHolder.displayName);
viewHolder.checked_displayName.setTag(viewHolder);
if(!bolarray.get(viewHolder.contact_id)){
bolarray.put(viewHolder.contact_id, false);
viewHolder.checked_displayName.setChecked(false);
viewHolder.isChecked=false;
}else{
bolarray.put(viewHolder.contact_id, true);
viewHolder.checked_displayName.setChecked(true);
viewHolder.isChecked=true;
}