LayoutManager详解及使用(一)

RecyclerView越来越流行,曾经的ListView也逐渐被淘汰,然而RecyclerView的作用绝不仅仅是代替ListView,正如他的名字“Recycler”,只要是需要重复使用的元素都可以用RecyclerView来实现。而这些各式各样的显示效果就不得不提LayoutManger这个类了,LayoutManager的作用就是负责元素的布局和复用。

内置的LayoutManager

Google提供了三个LayoutManger可以直接使用,分别是LinearLayoutManagerGridLayoutManagerStaggeredGridLayoutManager。只需要一段代码就可以轻松的设置RecyclerView子元素的排列方式

mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
  • LinearLayoutManager
    线性布局,效果类似ListView,按线性顺序排列,可以设置水平方向和竖直方向。
    LinearLayoutManager

  • GridLayoutManager
    表格布局,可以实现类似相册多列排列的效果
    GridLayoutManager

    • StaggeredGridLayoutManager
      动态表格布局,可以方便的实现瀑布流效果 ![StaggeredGridLayoutManager](https://file.2fun.xyz

/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的回收池,stateRecyclerView的状态信息。当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)

Search by:GoogleBingBaidu