android 使用 recyclerview 渲染服务端图片列表不显示?

作者站长头像
站长
· 阅读数 4

Recyclerviewlayout 布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<ImageView
        android:id="@+id/image"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="centerCrop"
        tools:src="@drawable/background"
/>

适配器代码如下:

public class ImageRecyclerViewAdapter extends RecyclerView.Adapter<ImageViewHolder> {

    private final Activity activity;
    private final List<String> images;

    public ImageRecyclerViewAdapter(Activity activity, List<String> images) {
        this.activity = activity;
        this.images = images;
    }

    @NonNull
    @NotNull
    @Override
    public ImageViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        // 注意第三个参数;仅返回视图,不附加视图到parent
        View view = inflater.inflate(R.layout.recyclerview_item_image, parent, false);
        return new ImageViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull ImageViewHolder holder, int position) {
        String src = this.images.get(position);
        ImageView imageView = holder.getImageView();
        // 填充src
        Glide.with(this.activity.getBaseContext())
                .load(src)
                .into(imageView);
    }

    @Override
    public int getItemCount() {
        return this.images.size();
    }
}

通过上述代码渲染视图图片不显示!如果给图片布局设置一个高度又可以正常显示,这是为什么?

回复
1个回答
avatar
test
2024-06-26

可能是因为你的 ImageView 在布局文件里的 layout_height 设置成了 wrap_content。在加载图片的时候,因为图片还没有被加载进来,系统不知道图片的大小,所以没法正测量到 ImageView 的高度。你可以指定一个高度,android:layout_height="200dp"。或者用占位符:

Glide.with(this.activity.getBaseContext())
    .load(src)
    .placeholder(R.drawable.placeholder) // 设置占位符
    .into(imageView);

还有一种方法就是动态设置ImageView的高度:

Glide.with(this.activity.getBaseContext())
    .load(src)
    .addListener(new RequestListener<Drawable>() {
        @Override
        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
            return false;
        }

        @Override
        public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
            // 根据图片的宽高比设置ImageView的高度
            int width = imageView.getWidth();
            float aspectRatio = (float) resource.getIntrinsicWidth() / (float) resource.getIntrinsicHeight();
            int height = Math.round(width / aspectRatio);
            imageView.setLayoutParams(new ViewGroup.LayoutParams(width, height));
            return false;
        }
    })
    .into(imageView);


回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容