0

我在一行中有三个 TextView(Rating、VotesRating 和 Votes),但只能同时看到其中一个。这就是为什么我添加了一个Barrier带有这些 TextViews 的 ID movie_rating,movie_votes,movie_rating_votes。然后我用它在它下面Barrier添加另一个TextView(带有电影的描述)。但正如您在屏幕截图中看到的,描述文本可以在上面Barrier。这是一个如此错误的图书馆......

在此处输入图像描述

对于大多数 ViewHolders 来说,它工作正常,这太疯狂了

implementation "androidx.constraintlayout:constraintlayout:2.1.2"

完整布局

<com.google.android.material.card.MaterialCardView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/margin_0_5x"
    android:background="?android:attr/selectableItemBackground"
    android:clickable="true"
    android:focusable="true"
    android:onClick="@{(v) -> holder.onMovieClicked.invoke(movie)}"
    android:paddingHorizontal="@dimen/margin_2x"
    app:cardBackgroundColor="#2a2a2a">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:id="@+id/movie_image"
            android:layout_width="72dp"
            android:layout_height="0dp"
            android:scaleType="centerCrop"
            app:imageUrl="@{movie.imageUrl}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintDimensionRatio="67:98"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0"
            tools:background="@drawable/placeholder_movie" />

        <TextView
            android:id="@+id/movie_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginHorizontal="@dimen/margin_1x"
            android:layout_marginTop="@dimen/margin_0_25x"
            android:text="@{String.format(@string/movie_title, movie.number, movie.title, movie.year)}"
            android:textColor="@color/colorTextLight"
            android:textSize="16sp"
            app:layout_constrainedWidth="true"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0"
            app:layout_constraintStart_toEndOf="@id/movie_image"
            app:layout_constraintTop_toTopOf="parent"
            tools:text="1. Red Notice (2021)" />

        <TextView
            android:id="@+id/movie_certificate_runtime_genre_rating"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginHorizontal="@dimen/margin_1x"
            android:layout_marginTop="@dimen/margin_0_25x"
            android:text="@{movie.certificateRuntimeGenrerating}"
            android:textColor="#c9c9c9"
            android:textSize="12sp"
            app:layout_constrainedWidth="true"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0"
            app:layout_constraintStart_toEndOf="@id/movie_image"
            app:layout_constraintTop_toBottomOf="@id/movie_title"
            app:visible="@{movie.certificateRuntimeGenrerating != null}"
            tools:text="PG-13 | 118 min | Action, Comedy, Crime" />

        <TextView
            android:id="@+id/movie_rating"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/margin_1x"
            android:layout_marginTop="@dimen/margin_0_25x"
            android:layout_marginEnd="@dimen/margin_1x"
            android:drawablePadding="@dimen/margin_0_5x"
            android:gravity="bottom"
            android:text="@{movie.rating}"
            android:textColor="@color/colorTextLight"
            android:textSize="12sp"
            app:drawableStartCompat="@drawable/ic_star_rate"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0"
            app:layout_constraintStart_toEndOf="@id/movie_image"
            app:layout_constraintTop_toBottomOf="@id/movie_certificate_runtime_genre_rating"
            app:visible="@{movie.rating != null &amp;&amp; movie.votes == null}"
            tools:text="7.7" />

        <TextView
            android:id="@+id/movie_rating_votes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/margin_1x"
            android:layout_marginTop="@dimen/margin_0_25x"
            android:layout_marginEnd="@dimen/margin_1x"
            android:drawablePadding="@dimen/margin_0_5x"
            android:gravity="bottom"
            android:text="@{String.format(@string/ph_3_spaced, movie.rating, @string/text_separator, movie.votes)}"
            android:textColor="@color/colorTextLight"
            android:textSize="12sp"
            app:drawableStartCompat="@drawable/ic_star_rate"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0"
            app:layout_constraintStart_toEndOf="@id/movie_rating"
            app:layout_constraintTop_toBottomOf="@id/movie_certificate_runtime_genre_rating"
            app:visible="@{movie.rating != null &amp;&amp; movie.rating != null}"
            tools:text="7.7 | Votes: 20,215" />

        <TextView
            android:id="@+id/movie_votes"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/margin_1x"
            android:layout_marginTop="@dimen/margin_0_5x"
            android:layout_marginEnd="@dimen/margin_1x"
            android:text="@{movie.votes}"
            android:textColor="@color/colorTextLight"
            android:textSize="12sp"
            app:layout_constrainedWidth="true"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0"
            app:layout_constraintStart_toEndOf="@id/movie_rating_votes"
            app:layout_constraintTop_toBottomOf="@id/movie_certificate_runtime_genre_rating"
            app:visible="@{movie.votes != null &amp;&amp; movie.rating == null}"
            tools:text="Votes: 20,215" />

        <androidx.constraintlayout.widget.Barrier
            android:id="@+id/movie_rating_votes_bottom_barrier"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:barrierDirection="bottom"
            app:constraint_referenced_ids="movie_rating,movie_rating_votes,movie_votes" />

        <TextView
            android:id="@+id/movie_desc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginHorizontal="@dimen/margin_1x"
            android:layout_marginTop="@dimen/margin_0_25x"
            android:text="@{movie.description}"
            android:textColor="@color/colorTextDescLight"
            android:textSize="12sp"
            app:layout_constrainedWidth="true"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0"
            app:layout_constraintStart_toEndOf="@id/movie_image"
            app:layout_constraintTop_toBottomOf="@id/movie_rating_votes_bottom_barrier"
            app:visible="@{movie.description != null}"
            tools:text="When a single mom and her two kids arrive in a small town, they begin to discover their connection to the original Ghostbusters and the secret legacy their grandfather left behind." />

        <Space
            android:id="@+id/movie_bottom_space"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/margin_0_5x"
            app:layout_constraintTop_toBottomOf="@id/movie_desc"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</com.google.android.material.card.MaterialCardView>

方面

<dimen name="margin_1x">8dp</dimen>
<dimen name="margin_0_25x">2dp</dimen>
<dimen name="margin_0_5x">4dp</dimen>
<dimen name="margin_0_75x">6dp</dimen>
<dimen name="margin_1_5x">12dp</dimen>
<dimen name="margin_2x">16dp</dimen>
<dimen name="margin_2_5x">20dp</dimen>
<dimen name="margin_3x">24dp</dimen>
<dimen name="margin_4x">32dp</dimen>
<dimen name="margin_5x">40dp</dimen>
<dimen name="margin_6x">48dp</dimen>

绑定

@JvmStatic
@BindingAdapter("visible")
fun visible(view: View, visible: Boolean?) {
    view.isVisible = visible == true
}

RecyclerView 和 ViewHolder 类

class MoviesAdapter(
    private val onMovieClicked: (movie: Movie) -> Unit
) : PagingDataAdapter<Movie, MoviesAdapter.MovieViewHolder>(MovieComparator) {

    override fun onBindViewHolder(holder: MovieViewHolder, position: Int) {
        getItem(position)?.let {
            holder.bind(it, position)
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MovieViewHolder {
        val layoutInflater = LayoutInflater.from(parent.context)
        return MovieViewHolder(
            LayoutItemMovieBinding.inflate(layoutInflater, parent, false),
            onMovieClicked
        )
    }

    inner class MovieViewHolder(
        binding: LayoutItemMovieBinding,
        val onMovieClicked: (movie: Movie) -> Unit
    ) : BaseViewHolder<LayoutItemMovieBinding, Movie>(binding) {

        init {
            binding.holder = this
        }

        override fun bind(data: Movie, position: Int) {
            binding.movie = data
        }
    }

    private object MovieComparator : DiffUtil.ItemCallback<Movie>() {
        override fun areItemsTheSame(oldItem: Movie, newItem: Movie) = oldItem.id == newItem.id

        override fun areContentsTheSame(oldItem: Movie, newItem: Movie) = oldItem == newItem
    }
}
4

2 回答 2

0

这是这个已知错误的变体: https ://github.com/androidx/constraintlayout/issues/422 您可以关闭优化器来修复它。

于 2021-12-06T23:58:53.380 回答
0

如果没有整个布局,很难判断可能会发生什么,但请尝试以下操作:

app:layout_constraintBottom_toTopOf="@id/movie_bottom_space"从“movie_desc”中删除。

app:layout_constraintBottom_toBottomOf="parent"从中删除movie_bottom_space

添加app:layout_constraintTop_toBottomOf="@id/movie_desc"movie_bottom_space.

确保ConstraintLayout具有wrap_content它的高度。

这将堆叠视图并让ConstraintLayout的整体高度随其内容而波动。

于 2021-12-06T13:51:00.077 回答