Android RecyclerView实现图片自适应高度的瀑布流

本文介绍如何在项目中实现图片自适应高度的瀑布流效果,并解决滑动过程中出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中要实现图片自适应高度的瀑布流,咋样自适应高度呢?

1.item的高度宽度要wrap_content
2.获得图片的高度宽度
3.onBindViewHolder中绑定数据的时候,先获取item宽度,计算图片等比例缩放后的高度,为imageView设置参数

关键代码如下:
mRecyclerView = findViewById(R.id.recyclerview);
mRecyclerView.setPadding(8,8,8,8);
mRecyclerView.addItemDecoration(new SpacesItemDecoration(8));
layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(layoutManager);

imageAdapter = new ImageAdapter(context,mData);
mRecyclerView.setAdapter(imageAdapter);
public void onBindViewHolder(ImageViewHolder holder, int position) {
    final ImageData data = mData.get(position);

    //获取item宽度,计算图片等比例缩放后的高度,为imageView设置参数
    ViewGroup.LayoutParams layoutParams = holder.imageView.getLayoutParams();
    float itemWidth = (ScreenUtils.getScreenWidth(context) - 16*3) / 2;
    layoutParams.width = (int) itemWidth;
    float scale = (itemWidth+0f)/data.getWidth();
    layoutParams.height= (int) (data.getHeight()*scale);
    holder.imageView.setLayoutParams(layoutParams);

    Glide.with(context).
            load(data.getResourceId()).
            override(layoutParams.width, layoutParams.height).
            into(holder.imageView);
}
    itemView的宽度 = (屏幕的宽度-三个间隔(每个间隔是16))/ 2
效果图:

图片自适应高度的瀑布流

做了一个Demo,Demo中的图片都是放在drawable中的,不是url.
Demo地址:https://download.youkuaiyun.com/download/vida990717/11058264

本来以为这样就行了呢,结果实际中加了点击事件以后又遇到问题啦~~
滑动到最后,点击最后一个item,重新滑回最上面,最上面的item跳动,位置变了,有空白的区域。

在网上找了找,用下面的方法解决了这个问题:

layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void  onScrollStateChanged(RecyclerView recyclerView, int newState) {
        //防止第一行到顶部有空白区域
        layoutManager.invalidateSpanAssignments();
    }
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值