在Picasso图像加载后,如何更改RecyclerView中的行高?

时间:2018-04-04 12:55:19

标签: android android-recyclerview kotlin picasso

我目前有一个包含帖子的RecyclerView(类似于Facebook帖子或推文等),带有可选图片。在我的适配器的onBindViewHolder方法中,我使用Picasso加载图像,但在加载之前我不知道图像的大小。我希望帖子看起来正常(没有图像),直到图像加载,然后图像应该出现,行高应该增加,以适应新图像的原始宽高比。

在加载图像的那一刻,它仍然附着在行的底部,同时覆盖行的上半部分,即使从ImageView的顶部有一个约束到主体底部TextView。

我的项目使用ConstraintLayout作为根,ImageView定义为:

<ImageView
        android:id="@+id/imageViewMain"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="8dp"
        android:adjustViewBounds="true"
        android:scaleType="fitCenter"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="@+id/textViewBody"
        app:layout_constraintStart_toStartOf="@+id/textViewBody"
        app:layout_constraintTop_toBottomOf="@+id/textViewBody" />

我的onBindViewHolder方法类似于此(我使用Kotlin):

override fun onBindViewHolder(holder: HomeAdapter.ViewHolder, position: Int) {
    val item = items[position]

    val mainImage = item.imageUrl
    if (!mainImage.isNullOrEmpty()) {
        Picasso.get().load(mainImage).into(holder.imageViewMain, object: Callback{
            override fun onSuccess() {
                // Could I do something here?
            }

            override fun onError(e: Exception?) { }
        })
    }        
}

有没有人知道如何在图像加载时增加行高,而不是让图像覆盖行的其余部分?

1 个答案:

答案 0 :(得分:0)

试试这个

//set visibility gone
//set height 250dp
// set scale_type = fitXY
<ImageView
    android:id="@+id/imageViewMain"
    android:layout_width="0dp"
    android:layout_height="250dp"
    android:layout_marginBottom="8dp"
    android:layout_marginTop="8dp"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    android:visibility="Gone"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="@+id/textViewBody"
    app:layout_constraintStart_toStartOf="@+id/textViewBody"
    app:layout_constraintTop_toBottomOf="@+id/textViewBody" />

在你的功能中

// set visibility Visible in onSuccess callback.
override fun onBindViewHolder(holder: HomeAdapter.ViewHolder, position: Int) {
val item = items[position]

val mainImage = item.imageUrl
if (!mainImage.isNullOrEmpty()) {
    Picasso.get().load(mainImage).into(holder.imageViewMain, object: Callback{
        override fun onSuccess() {
            // Could I do something here?
            holder.imageViewMain.setVisibility(View.Visible)
        }

        override fun onError(e: Exception?) { }
    })
}        
}