Aamir Shah
Aamir Shah

Reputation: 4493

getView() not working properly

Look at the code :-

    @Override
public View getView(int position, View convertView, ViewGroup parent) {

    View row = convertView;

    if (row == null) {
        LayoutInflater inflater = ((Activity)  mContext).getLayoutInflater();
        row = inflater.inflate(R.layout.country_row, parent, false);
    }

    return row;
}

The country row XML is :--

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="match_parent"
  android:orientation="horizontal"
  android:weightSum="1" >

<TextView
    android:id="@+id/nameOfCountry"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="0.8"
    android:text="Country" />

<CheckBox
    android:id="@+id/checkBox"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="0.2"
    android:gravity="right" />

Now my question is once I check few of the check boxes in the list view and the scroll the list view, many other check boxes are automatically checked....

I know there is problem in getView but I'm not able to figure out where....

Also the problem is solved if I don't reuse the convert view. But that is a dumb idea...

Any thoughts.....

Upvotes: 0

Views: 713

Answers (2)

compuguru
compuguru

Reputation: 1065

That's because the ListView does recycling of views. Essentially, it reuses some views that go off screen to make the new ones on screen to help with performance. There are 2 ways of dealing with this:

  1. Set the values of the views before you return the row. For example, you would set the nameOfCountry and whether or not the checkbox is checked before the return view line. To do this though, you need to keep track of what is checked.

  2. Don't use the convertview and just inflate a new view every time. This may result in a performance hit, but as long as the list isn't too long it shouldn't be too noticable (at least in my experience). Simply igonre the convertview value

Upvotes: 1

patheticpat
patheticpat

Reputation: 841

You have to set the state of the checkbox explicitly if you reuse an old View.

Upvotes: 1

Related Questions