【发布时间】:2018-10-17 11:56:40
【问题描述】:
我为这个问题苦苦挣扎了很长时间。
我正在使用带有SnapHelper 的RecyclerView,并且我的项目正在水平滚动。我想根据该卡的特定数据在每个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