一、最终效果:

二、工程结构框架:

三、核心实现:

(1)、实现RecyclerView控件的适配器类

主要就是实现下面三个函数的重载:

 @NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_layout, parent, false);return new NormalHolder(itemView);}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {NormalHolder normalHolder = (NormalHolder) holder;normalHolder.mTitle.setText(mDatas.get(position).title);normalHolder.mUserName.setText(mDatas.get(position).userName);normalHolder.mHits.setText(mDatas.get(position).hits.toString());Class drawable = R.drawable.class;Field field = null;try {field = R.mipmap.class.getDeclaredField(mDatas.get(position).mainPic);int mainPicId = field.getInt(field.getName());WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);DisplayMetrics dm = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(dm);int width = dm.widthPixels;         // 屏幕宽度(像素)int height = dm.heightPixels;       // 屏幕高度(像素)float density = dm.density;         // 屏幕密度(0.75 / 1.0 / 1.5)int densityDpi = dm.densityDpi;     // 屏幕密度dpi(120 / 160 / 240)// 屏幕宽度算法:屏幕宽度(像素)/屏幕密度int screenWidth = (int) (width / density);  // 屏幕宽度(dp)int screenHeight = (int) (height / density);// 屏幕高度(dp)ViewGroup.LayoutParams lp = normalHolder.mMainPic.getLayoutParams();int wArea = (int)((screenWidth - 30) / 2  * density);   // 20dp是布局文件设定的边距Bitmap bmp = BitmapFactory.decodeResource(mContext.getResources(), mainPicId);int wBitmap = bmp.getWidth();int hBitmap = bmp.getHeight();double dRate = wArea / (double)wBitmap;int hArea = (int)(hBitmap * dRate);lp.width = wArea;lp.height = hArea;normalHolder.mMainPic.setLayoutParams(lp);normalHolder.mMainPic.setMaxHeight(wArea * 5);normalHolder.mMainPic.setImageResource(mainPicId);field = R.drawable.class.getDeclaredField(mDatas.get(position).headImage);int headImageId = field.getInt(field.getName());normalHolder.mHeadImg.setImageResource(headImageId);} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}}@Overridepublic int getItemCount() {return mDatas.size();}

(2)、应用瀑布流来布局

 generateDatas();   // 产生模拟数据RecyclerView mRv = findViewById(R.id.userList);// 布局StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE); //防止item 交换位置mRv.setLayoutManager(layoutManager);

(3)、放置拖动过程中顶部出现空白

   mRv.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);//防止第一行到顶部有空白区域layoutManager.invalidateSpanAssignments();}});

(4)、图片实现了轻量级的圆角处理,可以实现部分圆角化。

由类NiceImageView来实现图片圆角。

(5)、实现了放置item位置发生变化,同时将图片资源放到midmap里,有效放置拖动过程中的卡顿。

四、源码下载:

可以去这里下载:https://www.kbase12.com/android/doc/detail?id=ef594c604cf9498a8b73609e6665d3ae

欢迎有兴趣的朋友一起交流。

使用RecyclerView实现瀑布流,仿照小红书,解决顶部留白、卡顿等问题相关推荐

  1. 微信小程序实现瀑布流 仿小红书

    要做的小红书瀑布流效果 homepage.wxml代码 <!-- 瀑布流大概的思路就是,直接定义两列等宽的view,然后两列都加载相同的数据wx:if="{{index%2==1}}& ...

  2. RecyclerView实现瀑布流,图片自适应高度

    话不多说,先上效果图 对于RecyclerView,相信大家都不陌生了,这个集listView,GridView,瀑布流效果与一身强大控件,渐渐地渗透在每个App.... 还是回到正题,如何让Recy ...

  3. 怎样判断小红书被限流?小红书被限流有这几大表现

    屏幕前的各位小伙伴们,你们遇到过小红书账号被限流的情况吗? 说到小红书被限流,可能很多小伙伴都不太清楚什么情况就做账号限流,今天伯乐网络传媒就来给大家分享下怎样判断小红书被限流?小红书被限流的表现有哪 ...

  4. SwipeRefreshLayout+CardView+RecyclerView 精美瀑布流效果

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  5. 【RecyclerView】 五、RecyclerView 布局 ( 瀑布流 | 交错网格局管理器 StaggeredGridLayoutManager )

    文章目录 一.交错网格局管理器 StaggeredGridLayoutManager ( 瀑布流 ) 二.交错网格局管理器默认设置 三.交错网格局管理器水平方向设置 四.完整代码示例 五.Recycl ...

  6. android 水平方向瀑布流,Android RecyclerView(瀑布流)水平/垂直方向分割线

     Android RecyclerView(瀑布流)水平/垂直方向分割线 Android RecyclerView不像过去的ListView那样随意的设置水平方向的分割线,如果要实现Recycle ...

  7. 友盟登陆传值+OkHttp+recyclerview展示瀑布流+跳转Intent传值+属性动画

    友盟详情见 https://blog.csdn.net/aijaijgnaw/article/details/84203936 分包 友盟第三方登录 MyApp(Application) packag ...

  8. 使用RecyclerView实现瀑布流

    准备工作 添加网络权限,在此项目中用于获取网络图片 添加Glide依赖,用于加载图片 启用dataBinding,也可不用dataBinding,这里主要是练习一下 implementation 'c ...

  9. RecyclerView StaggeredGridLayoutManager瀑布流实现中遇到的问题

    1.下面的代码主要是用于布局错乱后,自动修复,以及防止item左右交换的问题.在我遇到的问题当中,如果只setGapStrategy,会导致列表往回滑动时,顶部出现空白的问题.所以需要开启系统自动计算 ...

最新文章

  1. python书籍_python书籍购买建议
  2. 单列集合List的实现类
  3. 白噪声检测_科学家尝试用智能扬声器的白噪声来监测婴儿的呼吸运动
  4. Hyperledger下子项目
  5. Win11系统安装教程 教你安装原版Win11系统
  6. summit超级计算机gpu温度,揭秘Summit:加速计算赋力全球最快超级计算机
  7. 三层交换技术与链路聚合
  8. 下个时代的前端研发,效率还能提升。PxCook 3.0,最高效的设计研发利器
  9. Windows 10 出现问题但您可以重试 MSA【closed】
  10. REST API 是什么?
  11. Activiti in Action(实战Activiti)-目录
  12. 全球混合现实产业引领者 孙立
  13. python 答题插件_大话西游答题器 Python版本
  14. Android 6.0 Marshmallow
  15. Premiere Pro之时间轴面板(二)
  16. MATLAB中能对三角函数降幂嘛,初中数学三角函数降幂公式
  17. 手机录屏并转换成gif动图
  18. 【Python】打印出所有的“水仙花数”
  19. Oracle 、SQL多字段分组统计
  20. web前端学习笔记(二)

热门文章

  1. 有趣的Ruby-学习笔记5
  2. 梯度下降法的理解以及马鞍点
  3. android之在app图标添加角标,Android之在app图标添加角标
  4. 【SE】Week2 : 个人博客作业
  5. 传感器技术—霍尔传感器(学习笔记九 补充)
  6. 2018年中国互联网婚恋交友行业发展现状分析及未来发展趋势预测【转】
  7. 【中英文论文写作——图片和表格】
  8. 一文回顾AI绘画的成长之路:从简笔画到真实人脸生成
  9. java mht 转换 html_Word单网页mht文件,汉字被html转义解决办法
  10. 《中国企业家》杂志:卫哲第二道伤疤