3

我有:

  • 带有 GridLayoutManager 的回收视图
  • 包含在 Framelayout 中的 ImageView(高度为 wrap_content 和宽度为 match_parent)的网格项目布局,因此图像底部 | 中心水平对齐
  • Picasso 从网络异步加载图像到 ImageView

当前情况:图片加载到imageView中,但是imageview的大小是回收的grid item的imageview的大小。

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

我试过的:

  1. notifyItemChanged() - 可以解决问题(至少在理论上),但我无法检查当前网格项的视图是否处于布局状态,所以我的应用程序因 IllegalStateException 而崩溃
  2. 用 Callback 监听 Picasso 的负载,onSuccess() 检查 imageview 的可绘制纵横比并尝试使用 requestLayout() 调整 imageview 本身的大小。不工作。(好吧,它起作用了,但只有当有动画或触发布局重绘的东西时。如果什么都没有,那么图像视图不会重绘。)
  3. 用 Callback 监听 Picasso 的负载,然后 onSuccess() 启动一个动画,为 imageview 的 alpha 设置动画。这将触发重绘。但这有时有时不起作用(我不知道为什么)。
4

3 回答 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>

PS 改变 FrameLayout 的大小:

viewHolder.frame.setMinimumWidth(neededWidth);

于 2015-04-17T08:46:03.527 回答
0

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

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

您可以更改 centerCrop,以使用纵横比

于 2015-04-17T08:09:14.287 回答
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());
            }
        }

就这样!

于 2019-03-31T08:15:12.520 回答