如何为CardView中的项目正确显示或隐藏ImageView?

时间:2018-10-17 11:56:40

标签: android android-imageview android-cardview custom-adapter

我在这个问题上苦苦挣扎了很长时间。

我正在使用RecyclerView和附加的SnapHelper,并且我的项目在水平滚动。我想根据该卡的特定数据在每个ImageViews项目中设置CardView的可见性。一切似乎都正常,但实际上并非如此。

启动应用后,所有CardView项都正常,应该可见的ImageViews可见,不应该的项可见。

但是,当我单击CardView时,将打开新的活动。当我返回上一个活动时,完全没有任何理由可以看到ImageView,应该消失了。随机CardView个项目就会发生这种情况。

这是我的card_view_item:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:orientation="vertical"
        android:paddingBottom="10dp"
        tools:context=".MainActivity">


        <android.support.v7.widget.CardView
            android:id="@+id/cardView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginEnd="8dp"
            android:clickable="true"
            android:focusable="true"
            android:visibility="visible"
            app:cardCornerRadius="8dp"
            app:cardElevation="5dp"
            app:cardPreventCornerOverlap="true"
            app:cardUseCompatPadding="true"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:clickable="false"
                android:focusable="false">

                <TextView
                    android:id="@+id/airplane"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="40dp"
                    android:layout_marginTop="24dp"
                    android:fontFamily="@font/roboto"
                    android:gravity="center_vertical"
                    android:text="Airplane"
                    android:textSize="24sp"/>


                <ImageView
                    android:id="@+id/airplaneImage"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:adjustViewBounds="true"
                    android:cropToPadding="false"
                    android:gravity="center_vertical"
                    android:transitionName="image_transition" />


                <ImageView
                    android:id="@+id/airplaneCondition"
                    android:layout_width="30dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="12dp"
                    android:layout_marginTop="24dp"
                    android:transitionName="condition_transition"
                    android:visibility="gone"
                    app:srcCompat="@drawable/condition" />

                <ImageView
                    android:id="@+id/airplaneAvailable"
                    android:layout_width="30dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="8dp"
                    android:layout_marginTop="24dp"
                    android:transitionName="availa

ble_transition"
                android:visibility="gone"
                app:srcCompat="@drawable/available" />



        </android.support.constraint.ConstraintLayout>

    </android.support.v7.widget.CardView>


</android.support.constraint.ConstraintLayout>

这是onBindViewHolder

@Override
public void onBindViewHolder(final MyViewHolder holder, final int listPosition) {

    ...
     Airplane arplane = airplaneArray.get(holder.getAdapterPosition());
    ...


     if (airplane.getCondition() == 1) {
        airpaneCondition.setVisibility(View.VISIBLE);
        airpaneCondition.setImageResource(R.drawable.condition);
    } else if (airplane.getVisited() == 0) {
        airpaneCondition.setVisibility(View.GONE);
        airpaneCondition.setImageResource(R.drawable.condition);
    }
    if (airplane.getAvailable() == 1) {
        airplaneAvailable.setVisibility(View.VISIBLE);
        airplaneAvailable.setImageResource(R.drawable.available);
    } else if (airplane.getAvailable() == 0) {
        airplaneAvailable.setVisibility(View.GONE);
        airplaneAvailable.setImageResource(R.drawable.available);
    }

}

2 个答案:

答案 0 :(得分:0)

此问题是由回收者视图回收项目引起的。 我认为最简单的方法是使所有imageView可见并重构代码以匹配您的业务逻辑...

@Override
public void onBindViewHolder(final MyViewHolder holder, final int listPosition) {

    ...
     Airplane arplane = airplaneArray.get(listPosition);
    ...
 airpaneCondition.setVisibility(View.VISIBLE);
 airplaneAvailable.setVisibility(View.VISIBLE);

//your business logic code...


}

答案 1 :(得分:0)

这可能是一种更困难的方法,但是您也可以设置多个视图持有人,并且拥有一个拥有所需图像视图的视图持有人,而另一个我不会忘记确切地如何实现此目的,但是就像您将您在bindview中的条件的逻辑,并根据条件设置视图持有者。在特定情况下,此方法对我来说效果很好。