LayoutManager详解及使用(一)
RecyclerView越来越流行,曾经的ListView也逐渐被淘汰,然而RecyclerView的作用绝不仅仅是代替ListView,正如他的名字“Recycler”,只要是需要重复使用的元素都可以用RecyclerView来实现。而这些各式各样的显示效果就不得不提LayoutManger
这个类了,LayoutManager
的作用就是负责元素的布局和复用。
内置的LayoutManager
Google提供了三个LayoutManger可以直接使用,分别是LinearLayoutManager
、GridLayoutManager
和StaggeredGridLayoutManager
。只需要一段代码就可以轻松的设置RecyclerView子元素的排列方式
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
LinearLayoutManager
线性布局,效果类似ListView,按线性顺序排列,可以设置水平方向和竖直方向。GridLayoutManager
表格布局,可以实现类似相册多列排列的效果- StaggeredGridLayoutManager
动态表格布局,可以方便的实现瀑布流效果 ![StaggeredGridLayoutManager](https://file.2fun.xyz
- StaggeredGridLayoutManager
/device-2017-09-15-154008.png)
LayoutManager的基本知识
自定义LayoutManager
需要继承 RecyclerView.LayoutManager
,必须重写方法generateDefaultLayoutParams()
,可参考如下方法:
@Override
public RecyclerView.LayoutParams generateDefaultLayoutParams() {
return new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT);
}
这个方法基本上没有什么变化,不重点介绍,接下来介绍几个比较重要的方法:
重要方法
onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state)
这个方法是进行子对象布局时执行的,它决定了RecyclerView的子对象放在什么位置,recycler
是RecyclerView的回收池,state
RecyclerView的状态信息。当LayoutManager初始化的时候,会执行这个方法进行子对象的布局工作,当界面刷新的时候也会调用这个方法,需要注意的是该方法在初始化的时候会执行两遍。canScrollVertically()/canScrollHorizontally()
是否可以竖直/水平滑动,返回bool值。scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state)
手指竖直滑动的时候,会调用这个方法来获取RecyclerView子对象的滚动距离,返回值是int,同样也有scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state)
。
常用API
recycler.getViewForPosition(position)
获取位置为position的View。getPosition(View view)
获取view的位置。measureChildWithMargins(View child, int widthUsed, int heightUsed)
测量view的宽高,包括外边距。layoutDecoratedWithMargins(View child, int left, int top, int right,int bottom)
将child显示在RecyclerView上面,left,top,right,bottom
规定了显示的区域。detachView(View child)
临时回收view。attachView(View child)
将detachView(View child)
回收的view拿回来。detachAndScrapAttachedViews(RecyclerView.Recycler recycler)
用指定的recycler临时移除所有添加的views。detachAndScrapView(View child, RecyclerView.Recycler recycler)
用指定的recycler临时回收view。removeAndRecycleAllViews(RecyclerView.Recycler recycler)
移除所有的view并且用给的recycler回收。removeAndRecycleView(View child, RecyclerView.Recycler recycler)
移除指定的view并且用给的recycler回收。offsetChildrenHorizontal(int dx)
水平移动所有的view,同样也有offsetChildrenVertical(int dy)