列表视图更新未触及的视图

时间:2015-04-01 11:51:35

标签: android xml listview

抱歉标题不好。

我在运行时向列表视图添加了一个切换按钮。 当我点击按钮时,它的状态会发生变化。但问题是当我向下滚动其他项目时也会被选中。

例如,如果点击第一个切换按钮,也会检查第6个切换按钮。

这是一种非常奇怪的行为。

以下是acitivty

的XML代码
        <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <RelativeLayout
            android:id="@+id/title_bar"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:background="@color/eros_now_title_bar">

            <ImageView
                android:id="@+id/back_button_image"
                android:layout_width="@dimen/toolbar_imageview_width_height"
                android:layout_height="@dimen/toolbar_imageview_width_height"
                android:layout_centerVertical="true"
                android:layout_margin="@dimen/back_image_margin"
                android:src="@drawable/ic_arrow_back" />

            <ImageButton
                android:id="@+id/back_button"
                android:layout_width="@dimen/toolbar_imagebutton_width_height"
                android:layout_height="@dimen/toolbar_imagebutton_width_height"
                android:layout_centerVertical="true"
                android:layout_marginRight="20dp"
                android:background="@drawable/npd_back_feedback" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignTop="@+id/back_button_image"
                android:layout_toRightOf="@+id/back_button"
                android:fontFamily="sans-serif-regular"
                android:text="Invite friends"
                android:textColor="@color/white"
                android:textSize="18sp"
                android:textStyle="bold" />

        </RelativeLayout>

        <EditText
            android:id="@+id/search_text"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:layout_below="@+id/title_bar"
            android:layout_margin="15dp"
            android:hint="Search"
            android:textColorHint="@color/hint_color"
            android:drawableRight="@drawable/search_blue_white"/>

        <ListView
            android:id="@+id/friends_list"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/search_text"
            android:layout_above="@+id/invite_count_view"
            android:layout_marginTop="15dp"
            android:divider="@color/transparent">

        </ListView>

        <RelativeLayout
            android:id="@+id/invite_count_view"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:layout_alignParentBottom="true">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:fontFamily="sans-serif-light"
                android:textSize="18sp"
                android:textColor="@color/eros_now_title_bar"
                android:text="10 more invites to go"
                android:layout_centerInParent="true"
                />


            </RelativeLayout>
    </RelativeLayout>

以下是我在适配器中充气的视图的XML代码

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/card_view"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingTop="10dp"
    android:paddingBottom="10dp">

    <com.makeramen.roundedimageview.RoundedImageView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/person_pic"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_marginLeft="26dp"
        android:layout_centerVertical="true"
        app:riv_corner_radius="50dip"
        android:src="@drawable/ic_person_grey600_36dp"/>

    <TextView
        android:id="@+id/name"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:layout_toRightOf="@+id/person_pic"
        android:layout_marginLeft="17dp"
        android:layout_centerVertical="true"
        android:textColor="@color/black"
        android:fontFamily="sans-serif-regular"
        android:textSize="16sp"
        android:text="Grumpy brother"
        android:ellipsize="end"/>

    <!--<ToggleButton-->
        <!--android:layout_width="wrap_content"-->
        <!--android:layout_height="wrap_content"-->
        <!--android:layout_alignParentRight="true"-->
        <!--android:layout_marginRight="35dp"-->
        <!--android:layout_centerVertical="true"-->
        <!--android:background="@drawable/invite_selector"-->
        <!--android:textOn=""-->
        <!--android:textOff=""-->
        <!--android:text="" />-->

</RelativeLayout>

这是getView的代码

public View getView(int i, View convertView, ViewGroup parent) {

Log.e("getView", "name = " + contacts.get(i).getName());

if (convertView == null) {
    convertView = LayoutInflater.from(activity).inflate(R.layout.friend_view, parent, false);
}
    TextView name = (TextView) convertView.findViewById(R.id.name);
    RoundedImageView image = (RoundedImageView) convertView.findViewById(R.id.person_pic);

    ToggleButton selector = new ToggleButton(activity);
    if (sdk < android.os.Build.VERSION_CODES.JELLY_BEAN)
        selector.setBackgroundDrawable(activity.getResources().getDrawable(R.drawable.ic_add_black_24dp));
    else
        selector.setBackground(activity.getResources().getDrawable(R.drawable.ic_add_black_24dp));

    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    params.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
    params.addRule(RelativeLayout.ALIGN_PARENT_END, RelativeLayout.TRUE);
    params.setMargins(0, 0, getPx(35), 0);
    selector.setLayoutParams(params);
    selector.setTextOff("");
    selector.setText("");
    selector.setTextOn("");
    selector.setOnCheckedChangeListener(this);
    selector.setTag(String.valueOf(i));
    selector.setChecked(contacts.get(i).getSelectedState());
    contacts.get(i).setButton(selector);
    RelativeLayout card = (RelativeLayout) convertView.findViewById(R.id.card_view);

    card.addView(selector);

    try {
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), contacts.get(i).getURI());
    } catch (IOException e) {
        contacts.get(i).setURI(Uri.parse(""));
    }

    name.setText(contacts.get(i).getName());
    if (!contacts.get(i).getURI().toString().equals(""))
        image.setImageURI(contacts.get(i).getURI());
    else
        image.setImageDrawable(activity.getResources().getDrawable(R.drawable.ic_person));

return convertView;

}

2 个答案:

答案 0 :(得分:0)

我看到您使用 contacts.get(i).getSelectedState() getview 中设置ToggleButton状态。

您是否使用 Adapter.notifyDatasetChanged()来更新列表视图的状态?

如果没有,请在切换按钮后添加该代码。

答案 1 :(得分:0)

因为您的项视图被重用,所以如果convertView为null,则只创建ToggleButton。如果convertView不为null,则从convertView获取并设置它的属性。

使用setTag和findViewWithTag来识别您的ToggleButton。