在 Picasso.load() 后如何更改 RecyclerView 中 ImageView 的大小?

3

我有:

  • 一个使用GridLayoutManager的recyclerview
  • 网格项布局中有一个ImageView(高度为wrap_content,宽度为match_parent),ImageView被包裹在一个Framelayout中,因此图像底部居中对齐|水平中心对齐
  • Picasso从Web异步加载图片到ImageView中

当前情况: 图像已加载到imageView中,但imageView的大小是回收的网格项imageView的大小。

我想要实现的目标: 在将图像加载到imageView中后,重新调整imageView的大小(重绘)。

我尝试过的方法:

  1. notifyItemChanged() - 理论上可以解决问题,但我无法检查当前网格项视图是否在布局状态下,因此我的应用程序崩溃了(IllegalStateException)。
  2. 使用Callback监听Picasso的加载,在onSuccess()中检查imageview drawable的aspectratio并尝试使用requestLayout()重新调整imageview本身的大小。没有成功。(好吧,它确实起作用,但只有在有动画或触发布局重绘的其他东西时才会起作用。如果没有任何东西,则不会重绘imageview。)
  3. 使用Callback监听Picasso的加载,在onSuccess()中启动一个动画来动态改变imageview的alpha值。这将触发重绘。但这有时有效,有时无效(我不知道为什么)。
3个回答

4
我所做的是将一个ImageView放入FrameLayout中,然后将该FrameLayout的大小更改为所需大小。希望这能对您有所帮助。
<FrameLayout
        android:id="@+id/frame"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true">

        <ImageView
            android:id="@+id/video_thumbnail"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="fitStart"
            android:adjustViewBounds="true" />

</FrameLayout>

提示:如何更改FrameLayout的大小:

viewHolder.frame.setMinimumWidth(所需宽度);


这一切都在适配器的onBindView()方法中完成,通过使用Picasso下载图片后进行处理? - user1915767
我想这取决于你是否知道所需的宽度。如果你知道,你可以在加载图像之前将其设置为框架。 - Max Makeichik

0

Picasso有一个调整图像大小的函数。类似这样:

Picasso.with(context)
  .load(url)
  .resize(50, 50)
  .centerCrop()
  .into(imageView)

您可以更改centerCrop,以调整宽高比


谢谢您的回答,但我不想调整图像大小以适应ImageView。我想要调整ImageView的大小,使整个图像都能适合其中。 - user1915767
我认为这不是一个好的解决方案,如果你调整ImageView的大小,UI会变得不一致。为此,存在scaleType,如果您不想丢失图像信息,请使用scaleType centerInside,这将显示所有图像在ImageView限制内。这是我的意见,在其他情况下我不知道如何帮助您。 - encastellano
我必须调整图片视图的大小,因为我将其置于FrameLayout底部|水平居中对齐(我也编辑了我的问题)。 因此,由于我需要将其居中(fitStart和fitEnd对我来说不合适),因此我可以在imageview上使用“fitCenter”。 - user1915767

0
我想展示这个内容,使用一个动态宽高的广告横幅列表示例,具体如下:
  • 创建一个item_campaign_banner.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white">

    <RelativeLayout
            android:id="@+id/campaignImageSuperView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

        <ImageView
                android:id="@+id/campaignImage"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:adjustViewBounds="true"
                android:scaleType="centerCrop"
                android:src="@drawable/campaign_image_error_icon"
                android:visibility="visible"
                android:layout_alignParentTop="true"
                android:layout_alignParentStart="true"/>

        <View
                android:id="@+id/campaignSectionLine"
                android:layout_width="match_parent"
                android:layout_height="5dp"
                android:layout_below="@+id/campaignImage"
                android:background="#F2F2F2" />

    </RelativeLayout>


</RelativeLayout>

创建一个名为 BannerHolder.java 的文件。
public class BannerHolder extends RecyclerView.ViewHolder {

    private ImageView campaignImage;
    private View campaignSectionLine;
    private ViewGroup campaignImageSuperView;

    public BannerHolder(@NonNull View itemView) {
        super(itemView);
        campaignImage = (ImageView) itemView.findViewById(R.id.campaignImage);
        campaignSectionLine =  itemView.findViewById(R.id.campaignSectionLine);
        campaignImageSuperView =  itemView.findViewById(R.id.campaignImageSuperView);
    }

    public ImageView getCampaignImage() {
        return campaignImage;
    }

    public ViewGroup getCampaignImageSuperView() {
        return campaignImageSuperView;
    }
}

然后将其应用于您创建的YourAdapter.java中的onBindViewHolder(@NonNull RecyclerView.ViewHolder incomingHolder, int position)方法。
if (incomingHolder instanceof BannerHolder) {

    BannerHolder bannerHolder = (BannerHolder) incomingHolder;
            Banner banner = (Banner) campaigns.get(position);

            if(banner != null && banner.getImage() != null && banner.getImage().getWidth() != null && banner.getImage().getHeight() != null) {
                Picasso.with(activity)
                        .load(banner.getImage().getUrl())
                        .error(R.drawable.campaign_image_error_icon)
                        .into(bannerHolder.getCampaignImage());

                bannerHolder.getCampaignImageSuperView().setMinimumWidth(banner.getImage().getWidth());
                bannerHolder.getCampaignImageSuperView().setMinimumHeight(banner.getImage().getHeight());
            }
        }

就是这样!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接