在前面的学习中,咱们已经对Adapter
有了大概的了解,在整个RecyclerView
的体系当中,Adapter
负责提供View
,而LayoutManager
负责决定它们在RecyclerView
中摆放的位置以及在窗口中不可见以后的回收策略。今天,咱们来一块儿看一下LayoutManager
的相关知识。bash
LayoutManager
的使用经过重写LayoutManager
,咱们能够获得各式各样的布局。官方提供了如下三种LayoutManager
:ide
LinearLayoutManager
GirdLayoutManager
StaggeredGridLayoutManager
下面,咱们就来一块儿学习它们的使用方式。布局
LinearLayoutManager
使用这个LinearLayoutManager
时,全部的Item
都是线性排列的,咱们能够指定如下两点。学习
LinearLayoutManager.OrientationHelper.VERTICAL
:
LinearLayoutManager.OrientationHelper.HORIZONTAL
:
Item
排列的顺序和滑动方向经过reverse
指定Items
排列的顺序:ui
true
:从右向左或从下到上排列,也就是position=0
的Item
位于最右边或最下面,往左或者往上滑动获得下一个Item
。
false
:和上面相反,也就是咱们常见的模式。GirdLayoutManager
经过spanCount
参数指定,至关于把RecyclerView
的每行或者每列均分为spanCount
个格子,每一个Item
能够占据一个或者多个格子,默认状况下每一个Item
占据一个格子,也就是均分。this
reverse
参数指定了Items
排列的顺序:spa
reverse=true
:逆序排列全部的Item
,和2.1.2
的排列方式有关,若是是纵向排列,那么position=0
的Item
位于左下角,若是是横向排列,那么位于右上角。reverse=false
:position=0
的Item
位于左上角。上面咱们说过,spanCount
指定的是分配的格子数,默认状况下每一个Item
会占据一个格子,若是想要改变每一行或者每一列Item
分配的比例,那么能够指定它们占据的格子数,若是该行或者该列剩余的格子不够分配了,那么就换行,可是必定不可以大于spanCount
的值:3d
public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup) {
mSpanSizeLookup = spanSizeLookup;
}
复制代码
下面是一个使用的例子:code
private void init() {
mTitles = new ArrayList<>();
for (int i = 0; i < 40; i++) {
mTitles.add(String.valueOf(i));
}
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv_content);
GridLayoutManager layoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return position % 3 == 0 ? 1 : 2;
}
});
recyclerView.setLayoutManager(layoutManager);
LayoutManagerAdapter adapter = new LayoutManagerAdapter(mTitles);
recyclerView.setAdapter(adapter);
}
复制代码
最终获得效果为: ip
StaggeredGridLayoutManager
spanCount
和宫格布局相似,能够指定每行或者每列划分的格子数,可是它不支持让某个Item
占据多个格子。
这个和上面两个LayoutManager
的原理相似,就不解释了。
默认状况下,若是咱们只生成一个StaggeredGridLayoutManager
,那么效果会是下面这样:
onBindViewHolder
中动态地改变每一个
itemView
的高度,这样才能够达到瀑布流的效果:
@Override
public void onBindViewHolder(LayoutManagerViewHolder holder, int position) {
holder.setTitle(mTitles.get(position));
ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams();
layoutParams.height = 200 + (position % 4) * 200;
holder.itemView.setBackgroundColor(holder.itemView.getResources().getColor(COLOR[position % 5]));
holder.itemView.setLayoutParams(layoutParams);
}
复制代码
以后,咱们会获得下面的效果:
平时的开发当中,这几个布局已经基本可以知足咱们的需求,若是须要了解自定义LayoutManager
,那么须要对RecyclerView
的整个机制就很好的了解,在分析完原理以后,咱们在详细讲解自定义LayoutManager
的方法。