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

Reply via email to