OK, further info. As could be seen from #newView, I was handling the onClick on the CheckedTextView myself and this was because I was using a normal Activity instead of a ListActivity. When I switched to a ListActivity, implemented ListActivity#onListItemClick and ditched the OnClickListener code above I noticed 2 things. 1) The CheckedText started staying checked even after scrolling (ie it starting to behave as expected). 2) Every time I toggle a list item, #bindView is being called once for each visible item.
Its great that this has made it started working. But a) I don't understand why it wasn't working before b) 2 from above seems pretty wasteful. Why should #bindView be called from all visible items just because one item has been checked/ unchecked? On Aug 15, 4:29 pm, William Ferguson <[email protected]> wrote: > Um, sorry, in attempting to simplify the example that I presented to > you I didn't manage a full text search and replace. > The text for #bindView should have read (and does in the running code) > > @Override > public void bindView(View view, Context context, Cursor cursor) { > final CheckedTextView checkedText = (CheckedTextView) view; > final MyCursor myCursor = (MyCursor) cursor; > > final Long rowId = myCursor.getRowId(); > > checkedText.setChecked(rowModel.isSelected(rowId)); > checkedText.setText(myCursor.getDescription()); > checkedText.setTag(rowId); > > Log.v(TAG, "rowId=" + rowId + " settingChecked=" + > rowModel.isSelected(rowId)); > } > > On Aug 14, 11:15 pm, Paul Turchenko <[email protected]> wrote: > > > I believe the issue is that you're getting rowId from > > rawContactsCursor (bindView method) which stays on the same record. > > IMO you should get row id from cursor coming to you in bindView. This > > way you'll get rowId for the record you are currently binding. > > To be simple, you are binding to the wrong record. > > > On Aug 14, 7:50 am, William Ferguson <[email protected]> > > wrote: > > > > I have a ListView that just contains a CheckedTextView. > > > I have a very simple CursorAdapter that populates CheckedTextViews. > > > When I click on an item, I can see that I am responding to the correct > > > row, store the value in my model and the CheckedText gets checked. > > > > However, when I scroll down and then back up again, while I see that > > > the model contains the correct value (in #bindView), calling > > > #setChecked on the CheckedTextView has no effect. Ie All items are > > > unchecked. > > > > Its gotta be something simple, but I can't see it. Any ideas? > > > > public final class SimpleAdapter extends CursorAdapter { > > > > private static final String TAG = "SimpleAdapter"; > > > > private final LayoutInflater inflater; > > > private final RowModel rowModel = new RowModel(); > > > > public SimpleAdapter(Activity context, MyCursor cursor) { > > > super(context, cursor, true); > > > inflater = (LayoutInflater) > > > context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); > > > } > > > > @Override > > > public View newView(Context context, Cursor cursor, ViewGroup > > > parent) { > > > final CheckedTextView checkedText = (CheckedTextView) > > > inflater.inflate(android.R.layout.simple_list_item_multiple_choice, > > > parent, false); > > > > final MyCursor myCursor = (MyCursor) cursor; > > > checkedText.setText(myCursor.getDescription()); > > > > final Long rowId = rawContactsCursor.getRowId(); > > > checkedText.setChecked(rowModel.isSelected(rowId)); > > > Log.v(TAG, "rowId=" + rowId + " settingChecked=" + > > > rowModel.isSelected(rowId)); > > > > checkedText.setTag(rowId); > > > > checkedText.setOnClickListener(new View.OnClickListener() { > > > public void onClick(View view) { // Toggle whether the Row > > > is selected or not. > > > final Long id = (Long) view.getTag(); > > > Log.v(TAG, "toggling rowId=" + rowId); > > > final boolean checked = rowModel.toggleSelected(id); > > > final CheckedTextView checkedTextView = > > > (CheckedTextView) view; > > > checkedTextView.setChecked(checked); > > > } > > > }); > > > > return checkedText; > > > } > > > > @Override > > > public void bindView(View view, Context context, Cursor cursor) { > > > final CheckedTextView checkedText = (CheckedTextView) view; > > > > final MyCursor myCursor = (MyCursor) cursor; > > > checkedText.setText(myCursor.getDescription()); > > > > final Long rowId = rawContactsCursor.getRowId(); > > > checkedText.setChecked(rowModel.isSelected(rowId)); > > > Log.v(TAG, "rowId=" + rowId + " settingChecked=" + > > > rowModel.isSelected(rowId)); > > > > checkedText.setTag(rowId); > > > } > > > > } -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

