随着md风格的推行,RecyclerView的使用日趋增多,而且经常与CardView组合起来形成强大绚丽的布局效果,而瀑布流就是其中比较常见的效果之一,今天就来记录一下如何简单实现瀑布流效果。

1.首先,先来讲下RecyclerView的item常见分布形式,RecyclerView用RecyclerView.LayoutManager类实现其item的排布方式,系统已经为我们默认提供了三个实现类:

  • LinearLayoutManager:线性管理器,支持item的横向与纵向的排布
  • GridLayoutManager:网格布局管理器,可以指定其水平或者竖直排布的行数或者列数
  • StaggeredGridLayoutManager:流式布局管理器

2.第一个线性管理器上次已经写过了,而网格布局管理器只要一句代码就可以实现:

myView.setLayoutManager(new GridLayoutManager(this,3));即分成三列来显示

3.下面来讲一下重点- 瀑布流的实现,其代码主要在上一次文章的基础上稍稍改进一下就ok了,上一篇文章:

主要思路:绘制item的时候为其随机指定高度就可以了

如何实现?当然是在MyAdapter中实现,看代码就明白了:

private List<Integer> heightList;//textview的高度信息
public MyAdapter(Context context,List<String> data){//构造方法
    layoutInflater=LayoutInflater.from(context);
    this.list=data;
    heightList=new ArrayList<Integer>();
    for (int i=0;i<data.size();i++){
        heightList.add((int)(Math.random()*300+160));//随机设置textview的高度
    }
}
//绑定数据
public void onBindViewHolder(final MyViewHolder holder, int position) {
    //获取textview的宽高等信息
    ViewGroup.LayoutParams layoutParams = holder.textView.getLayoutParams();
    layoutParams.height=heightList.get(position);//设置textview的高度
    holder.textView.setLayoutParams(layoutParams);
    holder.textView.setText(list.get(position));


    //如果设置了自定义的点击回调监听器,则设置点击事件
    if (myListener!=null){
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int pos=holder.getLayoutPosition();//点击的item控件的位置
                myListener.onItemClick(holder.itemView,pos);
                /*
                此方法返回的pos值与onBindViewHolder方法传入的position值有可能不同。
                根据SDK中的解释,在Recyclerview 进行添加、移除item等操作时,position位置可能会变化,
                而所有的adapter的刷新并不总是及时的,
                只有这个方法返回的才是当前item经过一些变换后所处的真正位置。
                 */
            }
        });
        //设置长按点击监听事件
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                int pos=holder.getLayoutPosition();
                myListener.onItemLongClick(holder.itemView,pos);
                return false;
            }
        });
    }

}

这里只把需要改的地方的代码放了上来,其他代码部分没变。设置textview的高度无疑使用LayoutParams这个类来实现,具体用法可以百度一下,这里用到的原理就是先将textview高度信息获取到,然后设置其高度信息,再讲高度信息传回去。

最后,在活动中设置一下瀑布流的管理器:

//设置流布局管理
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));

注意一下参数:第一个参数是行数或者列数,根据第二个参数来确定是行还是列,如果为VERITIAL则代表是三列,HORIONTAL则为三行。

下面来看看效果如何:

android recycleview瀑布流复杂组合 recyclerview瀑布流效果_Adapter