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

Reply via email to