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 <kmans...@gmail.com> 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 -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en