【Android】掌握自定义LayoutManager(一) 系列开篇 常见误区、问题、注意事项,常用API。

转载请标明出处:
http://blog.csdn.net/zxt0601/article/details/52948009
本文出自:【张旭童的博客】

本系列文章相关代码传送门:
自定义LayoutManager实现的流式布局
欢迎star,pr,issue。

本系列文章目录:
掌握自定义LayoutManager(一) 系列开篇 常见误区、问题、注意事项,常用API。
掌握自定义LayoutManager(二) 实现流式布局

概述

这篇文章是深入掌握自定义LayoutManager系列的开篇,是一份总结报告。部分内容不属于引言、过于深入,用作系列后续文章的参考,以及浏览完后的复习之用。

本文内容涉及RecyclerView、LayoutManager、RecyclerViewPool、Recycler。

注:
1 以下问题,初学者如有不理解的,可以不用太在意,等学习完自定义LayoutManager相关知识,写几个Demo再回来看更好理解。
2 在RecyclerView中,ItemView和ViewHolder其实是一一绑定的,所以提到的View = ViewHolder。

一 常见误区、问题、注意事项:

在自定义LayoutManager文章开始之前,我总结了一些我在学习以及阅读别人的文章、编码的过程中,遇到的一些疑惑问题,并附上我个人的理解与答案。欢迎拍砖讨论。

因网上有大量半吊子写的LayoutManager相关的中文文章。(包括我也是半吊子),所以很多文章看完了,心中都有N个疑问,如,作者好牛逼啊,但是为什么我独立写还是写不出来。 自定义一个LayoutManager就自动复用了吗?…等等,下面逐个来讲讲。

Q1 看完了,但是我独立写还是不知道怎么写。

A1: 自定义LayoutManager是一项颇有难度的工程,你很难仅仅阅读一两篇文章,花两三个小时就能学习完。
里面涉及到子View的布局,坐标的计算,偏移量的计算,在滑动时、在合适的时机回收屏幕上不再显示的View,如何判断这些View是在屏幕上不可见,以及View究竟是暂时detach掉,还是recycle回收掉…等大量问题
。老实说,也许我水平有限,这是我在学习Android过程中,耗时最久的几个知识点之一。(十几个小时才写出第一个及格的作品)
但是它值得你学习。所以独立写不出来别灰心,先仿照一个Demo写一写,如果用心理解,第二遍第二遍应该就可以独立完成了。

Q2 学习自定义LayoutManager需要的铺垫知识

一 :熟练掌握自定义ViewGroup。

(在自定义LayoutManager过程的第一步,onLayoutChildren()方法里,就类似于自定义ViewGroup的onLayout()方法。)
但与自定义LayoutManager相比,自定义ViewGroup是一种静态的layout 子View的过程,因为ViewGroup内部不支持滑动,所以只需要无脑layout出所有的View,便不用再操心剩下的事。
而自定义LayoutManager与之不同,在第一步layout时,千万不要layout出所有的子View,这里也是网上一些文章里的错误做法,他们带着老思想,在第一步就layout出了所有的childView,这会导致一个很严重的问题:你的自定义LayoutManager = 自定义ViewGroup。即,他们没有View复用机制
why?这里简单证明结论,在Q5的回答里会说明为什么。
在Adapter的onCreateViewHolder()方法里增加打印语句,如果你的数据源有100000条数据,那么在RecyclerView第一次显示在屏幕上时,onCreateViewHolder()会执行100000次,你就可以尽情的欣赏ANR了。
反观使用官方提供的三种LayoutManager,开始时屏幕上有n少个ItemView,一般就执行n次onCreateViewHolder(),(也有可能多执行1次),在后续滑动时,大部分情况都只是执行onBindViewHolder()方法,不会再执行onCreateViewHolder()。

二 : 熟练使用RecyclerView。这个不用多说,毕竟RecyclerView是LayoutManager的宿主。

其实会以上两点就可以开始我们的学习之旅了,不过如果能对RecyclerView的Adapter、RecyclerViewPool、ItemDecoration也有一定的了解那是最好。

Q3 自定义LayoutManager的实战场景多吗?

A3:实战场景还是相当有限的。系统自带的三个LayoutManager已经很够用,满足绝大部分需求。

我个人从学习自定义LayoutManager至今的收获 ,大部分是对RecyclerView机制的理解进一步加深,也会伴随一定量的源码阅读经验提升。随没有我想象中的提升巨大生产力的赶脚,因为很多时候,产品设计要求的布局,现有方案已经可以很好解决。

但是它值得学习

Q4 自定义一个LayoutManager就自动复用ItemView了吗?

A4:不是,实际上这是自定义LayoutManager的重头戏之

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值