Checkbox in ListView with CursorAdapter

My problem is very similar than this post . In each row of my ListView, I have a flag with a listener. List of update database for the listener.

@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); } } 

I have 2 problems.

  • Scrolling issue. Moving the list I have lost the state of the check box for a line that disappears from the screen.
  • Anytime I use setChecked, the called listenr invokes a new db update.

To solve the scrolling problem, I wanted to use adapter.changeCursor every time I update db, but for the second problem, it causes a loop.

I am also trying to use an Array array, as in the second answer of the above message, but it uses the getView od adapter method, I have cursorAdapter and work in newView and bindView

How can i solve the problem?

edit: auselen solution works, but it creates and destroys many listeners, is there another more efficient solution?

+2
source share
2 answers

To avoid triggering callbacks on the listener, you must unregister the existing one on cb.setOnCheckedChangeListener(null) and then set cb.setChecked(c.getBoolean(c.getColumnIndex("state"))) again, then cb.setOnCheckedChangeListener() .

However, you should consider the best way to use this OnCheckedChangeListener , as you will end up creating more listeners than you need.

+3
source
 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; } 
0
source

Source: https://habr.com/ru/post/969544/


All Articles