在Picasso.load()之后在recyclerview中更改ImageView大小?

问题描述 投票:3回答:3

我有:

  • 使用GridLayoutManager的recyclerview
  • 其中包含ImageView的网格项布局(包含高度wrap_content和width match_parent)包含在Framelayout中,因此图像位于底部| center_horizo​​ntal对齐
  • 毕加索从Web上异步加载图像到ImageView

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

我想要实现的目标:将图像加载到imageview后,在运行时调整imageview的大小(重绘)。

我尝试过的:

  1. notifyItemChanged() - 可以做到这一点(理论上至少),但我无法检查当前网格项的视图是否处于布局状态,因此我的应用程序崩溃了IllegalStateException
  2. 用Callback听Picasso的负载,onSuccess()检查imageview drawable aspectratio并尝试使用requestLayout()调整imageview本身的大小。不工作。 (它确实有效,但只有在有动画或触发重新布局的东西时才会有效。如果没有任何内容,则不会重新绘制imageview。)
  3. 用回调来听Picasso的负载,onSuccess()启动一个动画来设置imageview的alpha动画。这将触发重绘。但这有时有时不起作用(我不知道为什么)。
android imageview android-recyclerview picasso gridlayoutmanager
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(neededWidth);


0
投票

毕加索具有调整图像大小的功能。像这样的东西:

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

您可以更改centerCrop,以使用宽高比


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());
            }
        }

就这样!

© www.soinside.com 2019 - 2024. All rights reserved.