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

