随着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则为三行。
下面来看看效果如何: