【问题标题】:How to correctly show or hide ImageView for items in CardView?如何正确显示或隐藏 CardView 中项目的 ImageView?
【发布时间】:2018-10-17 11:56:40
【问题描述】:

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

我正在使用带有SnapHelperRecyclerView,并且我的项目正在水平滚动。我想根据该卡的特定数据在每个CardView 项目中设置ImageViews 的可见性。一切似乎都运行良好,但实际上并非如此。

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

但是当我点击CardView 时,会打开新的活动。当我返回上一个活动时,完全没有理由,应该是 GONE 的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);
    }

}

【问题讨论】:

  • 你可以用你的cardview或imageview的位置保存GONE状态
  • 可能 listposition 没有重新启动 onbackpressed
  • 这是一个回收问题,你不能有 imageView 的默认初始状态。在 onBindViewHolder 上,您必须为每个 imageView 指定可见/已消失,您的代码逻辑必须是 if/else if/else 为默认状态,否则将使用最后一个状态...
  • 我已经为默认状态添加了 else - 但同样的事情又发生了。
  • 你在哪里设置适配器? onCreate() 还是 onResume()?你也可以试试onResume()里面的refreshDatasetChanged(),它可能会解决问题

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


【解决方案1】:

这可能是一种更难的方法,但您也可以设置多个视图,并拥有一个视图,其中包含您想要的图像视图和另一个我不会忘记确切如何完成此操作的视图,但就像您将bindview 中条件的逻辑,并根据条件设置视图。在特定情况下,这种方法对我很有效。

【讨论】:

    【解决方案2】:

    这是由回收站查看回收项目引起的。 我认为最简单的方法是让所有 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...
    
    
    }
    

    【讨论】:

    • 谢谢,我试图在 if 条件 之前使所有 ImageViews 可见(或 GONE),但同样的事情发生了。我不知道怎么了
    • 所以保留它并记录您的数据以查看数据是否已更改!另外,为什么你使用持有人。 getAdapterPosition 而不是 listPosition?我认为你必须使用 listPosition
    • 如果我将 Log.d 放入 onBindViewHolder 以查看当用户从不同的 Acitivity 返回时数据是否发生了变化,但我可以看到数据仅在加载应用程序时一次。我已将 holder.getAdapterPosition() 更改为 listPosition,但这绝对没有效果。问题依然存在!
    • 现在的实际问题是,当用户单击 CardView 以启动另一个 Activity 以及用户从上一个活动。
    • 能否请您分享适配器和活动的漏洞代码...要调试此行为,您必须记录对 onBindViewHolder 的所有调用并检查您的数据...您是否正确调用数据更改?你的飞机阵列和飞机是不可变的吗?
    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多