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

时间:2015-04-17 07:44:34

标签: android imageview android-recyclerview picasso gridlayoutmanager

我有:

  • 使用GridLayoutManager的回收者视图
  • 网格项布局,其中包含ImageView(高度wrap_content和宽度match_parent)包裹在Framelayout中,因此图像底部| center_horizo​​ntal对齐
  • Picasso将图像从网络异步加载到ImageView中

现状: 图像被加载到imageView中,但imageview的大小是回收网格项的imageview的大小。

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

我尝试过:

  1. notifyItemChanged() - 可以做到这一点(理论上至少),但是我 我无法检查当前网格项的视图是否在布局中 州,所以我的应用程序崩溃与IllegalStateException
  2. 使用Callback听Picasso的加载,onSuccess()检查imageview drawable aspectratio并尝试调整imageview本身的大小 requestLayout()。不工作。 (它确实有效,但只有在那里 是一个动画或触发重新布局的东西。如果 什么都没有,那么imageview不会被重新绘制。)
  3. 使用回调收听Picasso的加载,onSuccess()启动一个动画,为imageview的alpha设置动画。这将触发重绘。但这有时候有时不起作用(我不知道为什么)。

3 个答案:

答案 0 :(得分: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>

P.S。改变FrameLayout的大小:

viewHolder.frame.setMinimumWidth(neededWidth);

答案 1 :(得分:0)

Picasso具有调整图像大小的功能。像这样:

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

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

答案 2 :(得分: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;
    }
}
  
      
  • 比在onBindViewHolder(@NonNull RecyclerView.ViewHolder incomingHolder, int position)方法中应用   您创建的 YourAdapter.java
  •   
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());
            }
        }

仅此而已!