瀑布流样式

RecyclerView的瀑布流布局管理器是StaggeredGridLayoutManager,它最常用的构造函数就一个,StaggeredGridLayoutManager(int spanCount, int orientation),spanCount代表每行或每列的Item个数,orientation代表列表的方向,竖直或者水平。

看在代码中的使用。

// 初始化布局管理器
mLayoutManager = new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL);
// 设置布局管理器
mRecyclerView.setLayoutManager(mLayoutManager);
// 设置adapter
mRecyclerView.setAdapter(mAdapter);
// 设置间隔样式
mRecyclerView.addItemDecoration(new MDStaggeredRvDividerDecotation(this));

要实现瀑布流效果(仅讨论竖直方向的瀑布流样式),每一个Item的高度要有所差别,如果所有的item的高度相同,就和网格样式是一样的展示效果。示例中就实现两中不同高度的Item,一个高度为80dp,一个高度为100dp。

view_rv_staggered_item.xml布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="80dp"><TextViewandroid:id="@+id/item_tv"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"tools:text="item"/>
</LinearLayout>

view_rv_staggered_item_two.xml布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="100dp"><TextViewandroid:id="@+id/item_tv"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"tools:text="item"/>
</LinearLayout>

Item不同的布局是在Adapter里面绑定的,看一下Adapter的实现。

public class MDStaggeredRvAdapter extends RecyclerView.Adapter<MDStaggeredRvAdapter.ViewHolder> {// 展示数据private ArrayList<String> mData;public MDStaggeredRvAdapter(ArrayList<String> data) {this.mData = data;}public void updateData(ArrayList<String> data) {this.mData = data;notifyDataSetChanged();}@Overridepublic int getItemViewType(int position) {// 瀑布流样式外部设置spanCount为2,在这列设置两个不同的item type,以区分不同的布局return position % 2;}@Overridepublic MDStaggeredRvAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {// 实例化展示的viewView v;if(viewType == 1) {v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_rv_staggered_item, parent, false);} else {v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_rv_staggered_item_two, parent, false);}// 实例化viewholderViewHolder viewHolder = new ViewHolder(v);return viewHolder;}@Overridepublic void onBindViewHolder(MDStaggeredRvAdapter.ViewHolder holder, int position) {// 绑定数据holder.mTv.setText(mData.get(position));}@Overridepublic int getItemCount() {return mData == null ? 0 : mData.size();}public static class ViewHolder extends RecyclerView.ViewHolder {TextView mTv;public ViewHolder(View itemView) {super(itemView);mTv = (TextView) itemView.findViewById(R.id.item_tv);}}
}

接下来是设置瀑布流样式的间隔线样式的,上面代码中使用的是MDStaggeredRvDividerDecotation类,其实是直接拷贝的网格样式的间隔线绘制类。看一下运行效果。

瀑布流间隔样式

很奇怪,间隔线并没有按照我们想象中的方式绘制,仔细看瀑布流中Item的分布,发现瀑布流样式的Item分布和网格样式的Item分布有些不同。对比一下两者Item的分布,如下图。

网格样式的Item分布规律很明显,竖直方向的网格,Item是从左向右从上到下依次按顺序排列分布。

瀑布流样式的Item分布也是从上到下,从左到右的顺序排列,但是有一个高度的优先级,如果某一列中有一个高度最低的位置为空,最优先在此处添加Item。看第三张图的3 item,因为该位置最低,优先在此处添加Item。

分析出了瀑布流样式的Item的分布规律,就会发现,按照以往列表样式或者网格样式去设置间隔线是有问题的,因为不知道Item具体的位置,上下左右间隔线是否需要绘制不确定,参考第二张图,其实第三张图的间隔线也有问题,向上滑动就会展示出来。

目前能考虑到的瀑布流添加间隔线的思路:

  • Item布局中设置四周间隔padding/margin
  • 代码中动态修改ItemView的间隔padding/margin

设置间隔有两个方法:

  • 上下左右都设置间隔
  • 相邻两边设置间隔(左上/左下/右上/右下)

第一种设置间隔的方法会导致相邻的Item间距是间隔的两倍,第二种设置间隔的方法会导致Item某一个方向上的与父布局边缘无间隔,但是另一个方向与父布局边缘有间隔,例如左上相邻两边设置了间隔,最左边一列的Item左边与父布局边缘有间隔,但是最右边一列Item右边与父布局无间隔,第一行和最后一行的Item也会出现这种情况。

要解决上面的问题,父布局RecyclerView也需要根据相应的情况设置padding让整个布局的间隔都一致。下面的例子是选择在Item布局中设置间隔,因为可以自己在布局文件中控制颜色比较方便,选择右下两边设置间隔。

首先修改两个Item的布局文件。
view_rv_staggered_item.xml修改背景色和外层间距背景色。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="@dimen/md_common_view_height"android:background="@color/md_divider"android:paddingBottom="5dp"android:paddingRight="5dp"><TextViewandroid:id="@+id/item_tv"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:background="@color/md_white"tools:text="item"/>
</LinearLayout>

同样修改view_rv_staggered_item_two.xml。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="100dp"android:paddingBottom="5dp"android:paddingRight="5dp"android:background="@color/md_divider"><TextViewandroid:id="@+id/item_tv"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:background="@color/md_white"tools:text="item"/>
</LinearLayout>

最后修改RecyclerView的一些属性。

<android.support.v7.widget.RecyclerViewandroid:id="@+id/my_recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/md_divider"android:paddingLeft="5dp"android:paddingTop="5dp"android:fadeScrollbars="true"/>

运行一下,看看最后的效果。

差不多完美的解决了间隔线的问题,有细心的同学可能发现,在RecyclerView滑动的时候上面一直有一条灰色的间隔线,这个可以通过取消xml布局文件中RecyclerView的paddingTop属性去掉顶部灰色的间隔线。

Recycle网格制式之瀑布流的实现相关推荐

  1. 使用css3的网格(Grid),做出瀑布流式布局

    效果如下: 关于Grid(网格) 布局,就看大神阮一峰的Grid 网格布局教程 效果的代码如下: html代码 <!DOCTYPE html> <html lang="en ...

  2. android 瀑布流

    最终效果图 1.item_demo5.xml <?xml version="1.0" encoding="utf-8"?> <LinearLa ...

  3. html流式布局插件,Jquery瀑布流网格布局插件

    插件描述:一款简单且高度可定制的jQuery瀑布流网格布局插件.通过该瀑布流网格插件你可以动态添加和删除各种尺寸的图片,定义图片宽度,设置网格的列数,或使用流式布局方式,甚至还可以通过URL动态添加图 ...

  4. 相片堆叠瀑布流网格布局动画效果

    介绍: 一款效果超酷堆叠相片转瀑布流网格布局动画效果设计.该效果的灵感来源于takeit网站,它上面的一组堆叠相片在点击按钮或向下滚动鼠标时,会动画转换为网格瀑布流布局 网盘下载地址: http:// ...

  5. android实现超酷的腾讯视频首页和垂直水平网格瀑布流一揽子效果

    代码地址如下: http://www.demodashi.com/demo/13381.html 先来一波demo截图 实现ListView.GridView.瀑布流 1.导入RecyclerView ...

  6. Android开发笔记(二十二)瀑布流网格WaterfallGridView

    瀑布流网格的产生背景 Android中展示门类信息一般使用列表视图ListView或者网格视图GridView,特别是电商类APP的首页,除了顶部导航.底部标签.上方横幅外,主要页面都是展示各种商品和 ...

  7. Android冒险之旅-14-RecycleView(线性,网格,瀑布流)

    RecycleView 本文介绍   实现了RecycleView的三种布局,线性布局,网格布局,瀑布流布局   适配器和Activity基本每条语句都有注释   还有适配器中,在两个方法中设置点击事 ...

  8. StaggeredGridView瀑布流,网格布局

    框架集合:https://github.com/Solido/awesome-flutter 1.插件:flutter_staggered_grid_view: ^0.3.0 建议使用0.3.0以上的 ...

  9. 30个创意出色的非常实用的jquery框架插件-(视觉大背景,瀑布流效果)

    jQuery是在网页设计师和开发者最近的热门话题之一.人们使用它的广泛范围从个人博客到企业网站,目前流行的视觉大背景滚动效果,瀑布流图片阴影效果,图片缩放,动态标签复制,html5音频播放,视频播放等 ...

最新文章

  1. 开启报名丨图神经网络前沿学术研讨会
  2. 【Network】高性能 UDP 服务应该怎么搞?
  3. 微软MIX11大会第一天主旨以及新产品发布总结
  4. Base64加解密的实现方式
  5. nginx location 匹配 多个规则_三道小练习助你弄懂 Nginx location 匹配
  6. uboot之源码目录分析
  7. mogilefs杂记(2)
  8. Flex 结合sandy引擎创造
  9. ES6 类继承 和 super的使用
  10. mfc之DDX_Control作用
  11. 如何把Spring Boot 项目变成一个XML配置的Spring项目
  12. android 源码打patch
  13. 学习笔记--对最近学习的总结
  14. JAVA博客和书籍推荐
  15. 电厂供配电模拟实训系统QY-GPD03
  16. 黄金分割法,你会了吗?
  17. pbr发光 unity_Unity PBR—BRDF
  18. 学习笔记 | 零基础平面设计入门
  19. 常见3种视频加密原理知多少
  20. 紫外可见分光光度计 | 探索光的工具 | 详解

热门文章

  1. [转]在VS2010 VC++项目中引用Lib静态库(以Openssl为例)
  2. SQL一些时间格式的转换
  3. JQuery - Animate
  4. python的进程和线程定位_Python | 进程 线程的理解拾遗
  5. 3d建模电脑配置要求_建模你会一个软zbrush够吃一辈子,你学会了吗?
  6. Java多态提现_Java中的多态的一些体现,重写和包装类
  7. 设计灵感|如何设计出简洁吸引人的字体海报?
  8. 浓郁东方民俗剪纸风新年春节海报,psd分层模板
  9. 插画素材 | 圣诞节设计离不了!
  10. 多品类电商促销海报PSD分层模板,宠溺好物