To those who may follow, if you have a list of CheckedTextView you probably don't want the ListView to have any choice mode. Ie don't set: listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
And then you will be able to handle the checked state in your ListAdapter and wou will also not get #bindView fired a ridiculous number of times. On Aug 15, 5:26 pm, William Ferguson <[email protected]> wrote: > 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

