0

コードを見てください:-

    @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;
}

国の行のXMLは:-

<?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" />

リストビューのいくつかのチェックボックスをオンにしてリストビューをスクロールすると、他の多くのチェックボックスが自動的にチェックされます。

getViewに問題があることは知っていますが、どこにあるのかわかりません。

また、変換ビューを再利用しないと、問題は解決します。しかし、それはばかげた考えです...

何かご意見は.....

4

2 に答える 2

1

古いを再利用する場合は、チェックボックスの状態を明示的に設定する必要がありますView

于 2012-12-27T17:10:44.163 に答える
1

これは、ListViewがビューのリサイクルを行うためです。基本的に、画面から消えた一部のビューを再利用して、パフォーマンスを向上させるために新しいビューを画面に表示します。これに対処するには2つの方法があります。

  1. 行を返す前に、ビューの値を設定します。たとえばnameOfCountry、行の前にチェックボックスをオンにするかどうかを設定しますreturn view。ただし、これを行うには、何がチェックされているかを追跡する必要があります。

  2. を使用せず、convertview毎回新しいビューを膨らませるだけです。これによりパフォーマンスが低下する可能性がありますが、リストが長すぎない限り、目立たないようにする必要があります(少なくとも私の経験では)。単にconvertview値を無視する

于 2012-12-27T17:11:54.197 に答える