RecyclerView 瀑布流 StaggeredGridLayoutManager 图片自适应高度

 

 

效果图

 

不废话直接上代码

1.首先要集成  glide

implementation 'com.github.bumptech.glide:glide:4.12.0'

 

2.在主页(  没有什么特殊操作, 就是实例化适配器)

 

StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
rc_listview.setLayoutManager(staggeredGridLayoutManager);

adapter_home_recoment = new Adapter_Home_Recoment(BaseApplication.getContext(), datalist);
rc_listview.setAdapter(adapter_home_recoment);

 

3. 在适配器内

首先本地拿到图片的宽高
//获图片宽高,
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(compress_path, options);
 options.outHeight;//高
options.outWidth;//宽

把图片的宽高拼接到图片的名称内, 上传到服务器, 以上步骤需要在上传图片时完成!!!!!(因为适配器里要用到图片的原始宽高)

(拼接思路,如果服务器对图片链接做了处理, 返回了重新编译后的路径, 
则在 总的提交步骤时, 对服务器返回的 图片路径经行拼接, 
 如:http://11111.jpg?高+"&"+宽,http://11111.jpg  是服务器返回的上传后的路径)




然后,在适配器的 onBindViewHolder内做如下操作
ViewGroup.LayoutParams layoutParams = holder.ig_goodpic.getLayoutParams();
float itemWidth = (Utils.getScreenWidth(context) -  3) / 2;//每个item 的宽, 我这里是-3,是适配间距问题
layoutParams.width = (int) itemWidth;
float scale = (itemWidth + 0f) / 宽;//从链接中截取的
layoutParams.height = (int) ((Integer.parseInt(高)) * scale);//从链接中截取的
holder.ig_goodpic.setLayoutParams(layoutParams);




//图片加载高度自适应
Glide.with(context).
        load(datalist.get(position).getCover()).
        placeholder(R.drawable.img_big_loading).
        override(layoutParams.width, layoutParams.height).//重写图片的宽高,计算后的
        into(holder.ig_goodpic);

 

 

工具类:
public static int getScreenWidth(Context context) {
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics outMetrics = new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(outMetrics);
    return outMetrics.widthPixels;
}




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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android RecyclerViewAndroid 开发中用于显示列表和网格布局的高级组件,它提供了一种高效的方式来处理大量数据并保持良好的性能。瀑布流布局(也称为无限滚动瀑布流或 Masonry Layout)是 RecyclerView 中常用的一种特殊布局模式,它的特点是元素按瀑布式向下流动,每一行根据屏幕宽度自适应地排列,形成类似瀑布的效果。 在RecyclerView中实现瀑布流布局: 1. **布局管理器**:使用 GridLayoutManager 或者 StaggeredGridLayoutManager(适用于不规则布局),设置 spanSizePerRowWhenLargerThanScreen 分数,使得每一行的列数可以根据屏幕大小动态变化。 ```java GridLayoutManager layoutManager = new GridLayoutManager(context, 2, LinearLayoutManager.VERTICAL, false); layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { // 根据item的高度计算每个cell的宽度 return Math.max(1, (int) (Math.ceil(itemHeight / getResources().getDisplayMetrics().density))); } }); recyclerView.setLayoutManager(layoutManager); ``` 2. **ViewHolder**:创建一个自定义的 ViewHolder 类,负责复用和绘制每个item。 3. **加载更多**:通常使用 `onScrollListener` 或者 `ItemTouchHelper` 来监听滚动事件,并在底部加载更多的内容,确保瀑布流效果。 4. **数据源管理**:数据源需要包含高度信息,这样布局管理器才能正确计算每个item的span size。可以使用 `LinearLayoutManager` 的 `getItemDecoration()` 方法添加自定义的分隔线,同时动态调整高度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值