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

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.4k
1 个回答

可能是因为你的 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);


撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题