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