专栏名称: 郭霖
Android技术分享平台,每天都有优质技术文章推送。你还可以向公众号投稿,将自己总结的技术心得分享给大家。
目录
相关文章推荐
复利大王  ·  江浙沪美女留子回国下嫁怀孕后悔 ·  23 小时前  
复利大王  ·  某一线女网红下海? ·  23 小时前  
复利大王  ·  旅行卖淫:白天陪玩晚上陪...警方:严厉打击 ·  23 小时前  
复利大王  ·  好牛的幼儿园 ·  昨天  
复利大王  ·  老同学中捞一捞能不能找到免费P友 ·  昨天  
51好读  ›  专栏  ›  郭霖

掌握自定义LayoutManager之实现流式布局

郭霖  · 公众号  · android  · 2016-12-07 08:00

正文

请到「今天看啥」查看全文


自定义LayoutManager的步骤:

以本文的流式布局为例,需求是一个垂直滚动的布局,子View以流式排列。先总结一下步骤:

  • 实现 generateDefaultLayoutParams()

  • 实现 onLayoutChildren()

  • 竖直滚动需要 重写canScrollVertically()和scrollVerticallyBy()

下面我们就一步一步来吧。

实现generateDefaultLayoutParams

如果没有特殊需求,大部分情况下,我们只需要如下重写该方法即可。


RecyclerView.LayoutParams 是继承自 android.view.ViewGroup.MarginLayoutParams 的,所以可以方便的使用各种margin。

这个方法最终会在 recycler.getViewForPosition(i) 时调用到,在该方法浩长源码的最下方:


重写完这个方法就能编译通过了,只不过然并卵,界面上是一片空白,下面我们就走进onLayoutChildren()方法 ,为界面添加Item。

注: 99%用不到的情况:如果需要存储一些额外的东西在LayoutParams里,这里返回你自定义的LayoutParams即可。

当然,你自定义的LayoutParams需要继承自 RecyclerView.LayoutParams。

onLayoutChildren

该方法是LayoutManager的入口。它会在如下情况下被调用:

  • 在RecyclerView初始化时,会 被调用两次

  • 在调用adapter.notifyDataSetChanged()时,会被调用。

  • 在调用setAdapter替换Adapter时,会被调用。

  • 在RecyclerView执行动画时,它也会被调用。即RecyclerView 初始化 、 数据源改变时 都会被调用。

(关于初始化时为什么会被调用两次,我在系列第一篇文章里已经分析过。)

在系列开篇我已经提到,它相当于 ViewGroup 的 onLayout() 方法,所以我们需要在里面layout当前屏幕可见的所有子View, 千万不要layout出所有的子View 。本文如下编写:


这个 fill(recycler, state) 方法将是你自定义LayoutManager之旅一生的敌人,简单的说它承担了以下任务:

在考虑滑动位移的情况下:

  • 回收所有屏幕不可见的子View

  • layout所有可见的子View

在这一节,我们先看一下它的简单版本,不考虑滑动位移,不考虑滑动方向等,只考虑初始化时, 从头至尾 ,layout所有可见的子View,在下一节我会配合滑动事件放出它的完整版.


用到的一些工具函数(在系列开篇已介绍过):







请到「今天看啥」查看全文


推荐文章
复利大王  ·  江浙沪美女留子回国下嫁怀孕后悔
23 小时前
复利大王  ·  某一线女网红下海?
23 小时前
复利大王  ·  好牛的幼儿园
昨天
午夜漫画站  ·  色系漫画:解救专家
8 年前
走出去情报  ·  印度十大工程项目
7 年前
国泰海通证券研究  ·  晨报重点推荐:建发股份、建发股份
7 年前