RecyclerView的基本用法 (五)
2016-02-12 20:27
351 查看
这一次,我用一个极简的代码段来揭开layoutmanager的神秘面纱,而这段代码也仅仅是拿出了基本骨架,而该骨架是在自定义layoutmanager必须要有的,却只有这些骨架还远远不够,看了很多类似的项目源码也发现对每个子view进行相应的layout就是必不可少的需要自己定义,代码如下:
与viewgroup一样,重点还是在layoutDecorated(view, childLeft, childTop, 200, childTop + 100);这个方法上。而该方法看看源码就知道其作用就是view.layout,唯一却别也就是decorated这个关键字,这里就不详细解释了,了解recyclerview的都知道其作用,后面会着重讲decorate在recyclerview中的地位,代码如下:
那么在onLayoutChildren方法里,用遍历的方式对所有子view进行layout这种方式已经不新鲜了,因为凡是实现过自定义viewgroup的人都知道,所以也就不再赘述了。而这里需要强调几点:
1 与自定义view一样,只要目标明确,实现其实并不复杂,但头疼的最多的地方就是细节,因为需要处理的细节太多了,必须要面面俱到,而这里也是最容易增长bug的地方。
2 何时attach何时detach,何时remove何时recycle,需要根据需求而定的,而这是layoutmanager的职责所在,所以这些需要自己定义。
3 这一点纯属个人意见,在我看来,自定义layoutmanager的使用场景其实并不多,因为多数的需求完全可以用其他的简便方式所代替,甚至是其他方式来做会更好。而它的专属领域在于,子view数量不定且有列表性质,如果用自定义view来做,那就需要做一套view的回收机制倒不是说不可以详情在github上twowayview里有,但本着不重复造轮子的原则不如自定义layoutmanager;而很多时候一些需求又完全可以通过viewtype或者放到单个子view里去处理等等方式来实现,所以这时肯定是放到单个子view中去处理会更好。但特殊情况特殊处理。
以上就是自定义layoutmanager的所有我个人的理解,可商榷的地方肯定会不少,但最主要的还是对这几个开源项目的深入研究,很多地方会有很多坑,比如PreLayout。就算没有机会用到,但对recyclerview的理解肯定会加深不少。
@Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) { int itemCount = getItemCount(); if (itemCount == 0) { removeAllViews(); return; } removeAllViews(); mLastVisiblePosition = 0; //boolean isLastLayoutedView; int childLeft; int childTop; if (getChildCount() == 0) { childLeft = childTop = 0; }else { final View topChild = getChildAt(0); childLeft = getDecoratedLeft(topChild); childTop = getDecoratedTop(topChild); } do { View view = recycler.getViewForPosition(mLastVisiblePosition); addView(view); //isLastLayoutedView = mLayouter.isLastLaidOutView(view); layoutDecorated(view, childLeft, childTop, 200, childTop + 100); mLastVisiblePosition++; childTop += 100; } while (mLastVisiblePosition < itemCount); }
与viewgroup一样,重点还是在layoutDecorated(view, childLeft, childTop, 200, childTop + 100);这个方法上。而该方法看看源码就知道其作用就是view.layout,唯一却别也就是decorated这个关键字,这里就不详细解释了,了解recyclerview的都知道其作用,后面会着重讲decorate在recyclerview中的地位,代码如下:
public void layoutDecorated(View child, int left, int top, int right, int bottom) { final Rect insets = ((LayoutParams) child.getLayoutParams()).mDecorInsets; child.layout(left + insets.left, top + insets.top, right - insets.right, bottom - insets.bottom); }
那么在onLayoutChildren方法里,用遍历的方式对所有子view进行layout这种方式已经不新鲜了,因为凡是实现过自定义viewgroup的人都知道,所以也就不再赘述了。而这里需要强调几点:
1 与自定义view一样,只要目标明确,实现其实并不复杂,但头疼的最多的地方就是细节,因为需要处理的细节太多了,必须要面面俱到,而这里也是最容易增长bug的地方。
2 何时attach何时detach,何时remove何时recycle,需要根据需求而定的,而这是layoutmanager的职责所在,所以这些需要自己定义。
3 这一点纯属个人意见,在我看来,自定义layoutmanager的使用场景其实并不多,因为多数的需求完全可以用其他的简便方式所代替,甚至是其他方式来做会更好。而它的专属领域在于,子view数量不定且有列表性质,如果用自定义view来做,那就需要做一套view的回收机制倒不是说不可以详情在github上twowayview里有,但本着不重复造轮子的原则不如自定义layoutmanager;而很多时候一些需求又完全可以通过viewtype或者放到单个子view里去处理等等方式来实现,所以这时肯定是放到单个子view中去处理会更好。但特殊情况特殊处理。
以上就是自定义layoutmanager的所有我个人的理解,可商榷的地方肯定会不少,但最主要的还是对这几个开源项目的深入研究,很多地方会有很多坑,比如PreLayout。就算没有机会用到,但对recyclerview的理解肯定会加深不少。
相关文章推荐
- Java反序列化漏洞之Weblogic、Jboss利用之payload生成工具
- shell编程【分发系统】
- 大数据时代,计算模式从客户机/服务器到节点的转变
- java环境变量设置以及常见问题解决方法
- python 之 append extend
- 解决Mac下GDB提示签名错误
- 新装myeclipse后的一系列设置汇总
- C++学习笔记2
- 如何获取保存在路由器中的ADSL账号和密码
- 【bzoj1922】[Sdoi2010]大陆争霸 最短路变形
- virtual oj ACboy needs your help again!
- 1057: [ZJOI2007]棋盘制作
- Python 零碎信息-基础 02
- 自定义弹窗
- c 语言中级篇
- uva11988数组模拟单向链表
- Netty精粹之轻量级内存池技术实现原理与应用
- Tomcat分析--结构设计
- SMTP协议详解及工作过程
- 1021. 个位数统计