我在这个问题上苦苦挣扎了很长时间。
我正在使用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);
}
}
答案 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中的条件的逻辑,并根据条件设置视图持有者。在特定情况下,此方法对我来说效果很好。