Thanks I'll try your suggestions.

On Feb 26, 10:38 am, Kostya Vasilyev <[email protected]> wrote:
> Ah, yes, you are. Sorry, I missed that "tag" is a reference to your data
> object item.
>
> Now I can't see anything obviously wrong with the code you posted. In
> fact, I have code almost like this, including ViewHolder-type helper
> classes right in front of me, and it works.
>
> I have two suggestions for debugging:
>
> - add log statements inside onCheckedChanged, print the data object, its
> position, and new state;
> - get rid of ViewHolder thingies, call convertView.findViewById(...)
> directly.
>
> -- Kostya
>
> 26.02.2011 18:21, Wall-E пишет:
>
>
>
>
>
>
>
>
>
> > Kostya,
>
> > thanks for your help.  I believe I am doing what you suggest but if
> > not let me know:
>
> > I am setting the data item inside my getView in my
> > OnCheckChangedListener, for example:
>
> >         MyObject.plot = isChecked;    // so the plot variable holds the
> > checked state
>
> > Now when I set the checkbox layout item, I'm getting the value from my
> > data item, for example:
>
> >         holder.getCheckBox.setChecked(MyObject.plot);
>
> > So I may not be understanding fully what you suggest.  Do you think I
> > should store the checkbox layout item in MyObject?
>
> > Kapil,
>
> > thanks for your suggestion, I might go that route if I can't get this
> > checkbox issue figured out.
>
> > On Feb 26, 4:19 am, Kostya Vasilyev<[email protected]>  wrote:
> >> ViewHolder is not a good place to store data state - as you are doing.
>
> >> A ViewHolder is not associated with the data item, it's associated with
> >> the item layout, and when recycling happens, the view holder is also
> >> affected.
>
> >> You need to store selection state in MyObject, so it's completely
> >> separate from the list item views. With that done, you'll be able to
> >> count on selection state being correct when updating the UI (the check
> >> box). Make sure to update selection state in an appropriate MyObject
> >> based on user actions.
>
> >> -- Kostya
>
> >> 26.02.2011 5:00, Wall-E пишет:
>
> >>> I have a ListActivity and an ArrayAdapter that contains a list of an
> >>> Object for example ArrayAdapter<MyObject>.  Now in my ArrayAdapter I
> >>> inflate a layout that includes a checkbox.  I'm having the issue now
> >>> that when I click on the checkboxes it's fine until it scrolls past
> >>> the window.  Now I know that the adapter recycles views so let me
> >>> explain how I have my adapter set up and if anyone could kindly see
> >>> what I'm doing wrong:
> >>> I have a ViewHolder class such as the following:
> >>>           public class ViewHolder
> >>>     {
> >>>             View base;
> >>>             CheckBox checkbox;
> >>>             TextView tagTexView;
> >>>             TextView tagIDTextView;
> >>>             public ViewHolder(View base)
> >>>             {
> >>>                     this.base = base;
> >>>             }
> >>>             CheckBox getTagCheckBox()
> >>>             {
> >>>                     if(checkbox == null)
> >>>                     {
> >>>                             checkbox = (CheckBox) 
> >>> base.findViewById(R.id.tagInfoCheckBox);
> >>>                     }
> >>>                     return checkbox;
> >>>             }
> >>>             TextView getTagMainIdentifierTextView()
> >>>             {
> >>>                     if(tagTexView == null)
> >>>                     {
> >>>                             TwoLineListItem twoListItem = 
> >>> (TwoLineListItem)
> >>> base.findViewById(R.id.taginfo_layoutTwoLineListItem);
> >>>                             tagTexView = (TextView) 
> >>> twoListItem.getText1();
> >>>                     }
> >>>                     return tagTexView;
> >>>             }
> >>>             TextView getTagIDTextView()
> >>>             {
> >>>                     if(tagIDTextView == null)
> >>>                     {
> >>>                             TwoLineListItem twoListItem = 
> >>> (TwoLineListItem)
> >>> base.findViewById(R.id.taginfo_layoutTwoLineListItem);
> >>>                             tagIDTextView = (TextView) 
> >>> twoListItem.getText2();
> >>>                     }
> >>>                     return tagIDTextView;
> >>>             }
> >>>     }
> >>> Now in my getView method, I inflate convertView and create the
> >>> viewHolder if convertView is null or set the view holder if it's not
> >>> (holder = (ViewHolder) convertView.getTag()).
> >>> After that, I set all the values of the views by accessing the views
> >>> using the holder, for example:
> >>> holder.getTagCheckBox().setChecked(tag.plot);
> >>> where tag is MyObject that I get using getItem(position) inside my
> >>> getView and tag.plot is the boolean value that will indicate if the
> >>> checkbox should be checked or not.
> >>> I also created a OnCheckedChangeListener that just sets to tag.plot to
> >>> whatever the checked state is and then call notifyDataSetChanged();
> >>> So the text that I update in my views works just fine but the checkbox
> >>> seems to get screwed up and although I've read a few suggestions, none
> >>> of them have worked.
> >>>          @Override
> >>>     public View getView(final int position, View convertView, ViewGroup
> >>> parent)
> >>>     {
> >>>             mInflater = LayoutInflater.from(context);
> >>>             final MyObject tag = this.getItem(position);
> >>>             // A ViewHolder keeps references to children views to avoid
> >>>             // unneccessary calls to findViewById() on each row.
> >>>             ViewHolder holder;
> >>>             // When convertView is not null, we can reuse it directly, 
> >>> there is
> >>>             // no need to reinflate it. We only inflate a new View when 
> >>> the
> >>> convertView
> >>>             // supplied by ListView is null.
> >>>             if (convertView == null)
> >>>             {
> >>>                     convertView = 
> >>> mInflater.inflate(R.layout.taginfo_layout, null);
> >>>                     // Creates a ViewHolder and store references to the 
> >>> two children
> >>>                     // views we want to bind data to.
> >>>                     holder = new ViewHolder(convertView);
> >>>                     convertView.setTag(holder);
> >>>             }
> >>>             else
> >>>             {
> >>>                     // Get the ViewHolder back to get fast access to the 
> >>> TextView
> >>>                     // and the ImageView.
> >>>                     holder = (ViewHolder) convertView.getTag();
> >>>             }
> >>>             // Set the checkbox value to the value of tag.plot
> >>>             holder.getTagCheckBox().setChecked(tag.plot);
> >>>             holder.getTagCheckBox().setOnCheckedChangeListener(new
> >>> android.widget.CompoundButton.OnCheckedChangeListener()
> >>>             {
> >>>                     @Override
> >>>                     public void onCheckedChanged(CompoundButton 
> >>> buttonView,
> >>>                                     boolean isChecked)
> >>>                     {
> >>>                             tag.plot = isChecked;
> >>>                             notifyDataSetChanged();
> >>>                     }
> >>>             });
> >>>                   // just for testing I print out the position of the
> >>> view
> >>>             holder.getTagMainIdentifierTextView().setText("Position: " +
> >>> position);
> >>>             holder.getTagIDTextView().setText("Tag ID: " + tagid);
> >>>             return convertView;
> >>>     }
> >>> If anyone could find what my mistake is in terms of handling the
> >>> checkbox, I would greatly appreciate it.  Also let me know if I need
> >>> to post more code.
> >> --
> >> Kostya Vasilyev --http://kmansoft.wordpress.com
>
> --
> Kostya Vasilyev --http://kmansoft.wordpress.com

-- 
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