getView()无法正常工作

时间:2012-12-27 17:05:38

标签: android listview android-listview listadapter

查看代码: -

    @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存在问题,但我无法确定哪里....

如果我不重用转换视图,问题也解决了。但这是一个愚蠢的想法......

任何想法......

2 个答案:

答案 0 :(得分:1)

如果您重复使用旧版View,则必须明确设置复选框的状态。

答案 1 :(得分:1)

这是因为ListView可以回收视图。从本质上讲,它重用了屏幕上的一些视图,使屏幕上的新视图有助于提高性能。有两种方法可以解决这个问题:

  1. 在返回行之前设置视图的值。例如,您可以设置nameOfCountry以及是否在return view行之前选中复选框。但要做到这一点,你需要跟踪检查的内容。

  2. 请勿使用convertview,并且每次只是为新视图充气。这可能会导致性能下降,但只要列表不长,就不应该太明显了(至少根据我的经验)。只需igonre convertview