setHasFixedSize(true)的意义 (转)
RecyclerView setHasFixedSize(true)的意义
- <span style="font-size:18px;"> /**
- * RecyclerView can perform several optimizations if it can know in advance that RecyclerView's
- * size is not affected by the adapter contents. RecyclerView can still change its size based
- * on other factors (e.g. its parent's size) but this size calculation cannot depend on the
- * size of its children or contents of its adapter (except the number of items in the adapter).
- * <p>
- * If your use of RecyclerView falls into this category, set this to {@code true}. It will allow
- * RecyclerView to avoid invalidating the whole layout when its adapter contents change.
- *
- * @param hasFixedSize true if adapter changes cannot affect the size of the RecyclerView.
- */
- public void setHasFixedSize(boolean hasFixedSize) {
- mHasFixedSize = hasFixedSize;
- }</span>
注释说当知道Adapter内Item的改变不会影响RecyclerView宽高的时候,可以设置为true让RecyclerView避免重新计算大小。
设置为true,再调用notifyDataSetChanged(),发现大小重新计算了,看来理解出现错误了。还是再看一下哪些地方用到这个mHasFixedSize吧。
首先是onMeasure里用到,这个和自定义LayoutManager相关,先不管它。
剩下的就是triggerUpdateProcessor()方法了:
- <span style="font-size:18px;"> void triggerUpdateProcessor() {
- if (POST_UPDATES_ON_ANIMATION && mHasFixedSize && mIsAttached) {
- ViewCompat.postOnAnimation(RecyclerView.this, mUpdateChildViewsRunnable);
- } else {
- mAdapterUpdateDuringMeasure = true;
- requestLayout();
- }
- }</span>
看一下triggerUpdateProcessor方法被哪些调用
onItemRangeChanged(),
onItemRangeInserted(),
onItemRangeRemoved(),
onItemRangeMoved()
这样看就很明白了,当调用Adapter的增删改插方法,最后就会根据mHasFixedSize这个值来判断需要不需要requestLayout();
再来看一下notifyDataSetChanged()执行的代码,最后是调用了onChanged,调用了requestLayout(),会去重新测量宽高。
- @Override
- public void onChanged() {
- assertNotInLayoutOrScroll(null);
- mState.mStructureChanged = true;
- setDataSetChangedAfterLayout();
- if (!mAdapterHelper.hasPendingUpdates()) {
- requestLayout();
- }
- }
总结:当我们确定Item的改变不会影响RecyclerView的宽高的时候可以设置setHasFixedSize(true),并通过Adapter的增删改插方法去刷新RecyclerView,而不是通过notifyDataSetChanged()。(其实可以直接设置为true,当需要改变宽高的时候就用notifyDataSetChanged()去整体刷新一下)
- public final void notifyItemChanged(int position) {
- mObservable.notifyItemRangeChanged(position, 1);
- }
- public final void notifyItemChanged(int position, Object payload) {
- mObservable.notifyItemRangeChanged(position, 1, payload);
- }
- public final void notifyItemRangeChanged(int positionStart, int itemCount) {
- mObservable.notifyItemRangeChanged(positionStart, itemCount);
- }
- public final void notifyItemRangeChanged(int positionStart, int itemCount, Object payload) {
- mObservable.notifyItemRangeChanged(positionStart, itemCount, payload);
- }
- public final void notifyItemInserted(int position) {
- mObservable.notifyItemRangeInserted(position, 1);
- }
- public final void notifyItemMoved(int fromPosition, int toPosition) {
- mObservable.notifyItemMoved(fromPosition, toPosition);
- }
- public final void notifyItemRangeInserted(int positionStart, int itemCount) {
- mObservable.notifyItemRangeInserted(positionStart, itemCount);
- }
- public final void notifyItemRemoved(int position) {
- mObservable.notifyItemRangeRemoved(position, 1);
- }
- public final void notifyItemRangeRemoved(int positionStart, int itemCount) {
- mObservable.notifyItemRangeRemoved(positionStart, itemCount);
- }
setHasFixedSize(true)的意义 (转)的更多相关文章
- [Android]使用RecyclerView替代ListView(一)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4232560.html RecyclerView是一个比List ...
- [转]RecyclerView初探
原文地址:http://www.grokkingandroid.com/first-glance-androids-recyclerview/ RecyclerView是去年谷歌I/O大会上随Andr ...
- 【RecyclerView优化】
1.局部刷新 (1)避免整个列表的数据更新,只更新受影响的布局.例如,加载更多时,不使用notifyDataSetChanged(),而是使用notifyItemRangeInserted(range ...
- DiyCode开源项目 TopicActivity 分析
1.首先看看TopActivity效果. 2.TopicActivity是一个继承BaseActivity的.前面分析过BaseActivity了.主要有一个标题栏,有返回的图标. 3.贴一下T ...
- Android面试题收录及解答10月刊
前言 嗨,大家好,好久不见.这里跟大家侃侃这中间发生了什么. 一个月前呢,想准备面试,就网上随便找找面试题什么的,发现要么就是卖课的,要么就是不给详细回答的或者回答不够深的(也许是我没找到).反正稍微 ...
- 用Kotlin语言重新编写Plaid APP:经验教训(I)
原文标题:Converting Plaid to Kotlin: Lessons learned (Part 1) 原文链接:http://antonioleiva.com/plaid-kotlin- ...
- 组件RecyclerView的应用(一)
首先我们知道RecyclerView组件是ListView的升级版,今天先介绍基础的RecyclerView的基本布局RecyclerView.Adapter和LayoutManager 第一: La ...
- [spring源码学习]四、IOC源码——普通bean初始化
一.代码例子 此节开始涉及到一个bean具体生成和保存的过程,仅仅涉及到最简单的bean,代码依旧是最简单的 public static void main(String[] args) { Defa ...
- Android RecyclerView 的简单使用
Android L SDK发布的,新API中最有意思的就是RecyclerView (后面为RV) 和 CardView了, 按照官方的说法, RV 是一个ListView 的一个更高级更灵活的一个版 ...
随机推荐
- 创建LEANGOO账号
转自:https://www.leangoo.com/leangoo_guide/leangoo_guide_login.html#toggle-id-2 Leangoo采用SaaS模式运行,通过邮箱 ...
- mysql计算QPS
首先连接上mysql: $ mysql -h .x -P3306 -uusername -p123456 进入Mysql之后,查询general_log: mysql> SHOW VARIABL ...
- web项目部署在centos 7验证码显示不出来解决方案
今天把项目部署在centos7上,发现验证码显示不出来,看了一下tomcat日志 Exception in thread "http-nio-8080-exec-3" java.l ...
- K8S搭建过程随笔_证书CFSSL
安装CFSSL mkdir -p /opt/k8s/cert && cd /opt/k8swget https://pkg.cfssl.org/R1.2/cfssl_linux-amd ...
- RabbitMQ各种交换机类型Exchange Types介绍
最新版本的RabbitMQ有四种交换机类型,分别是Direct exchange.Fanout exchange.Topic exchange.Headers exchange. 一.Direct E ...
- python中的函数def和函数的参数
'''函数: 1.减少代码重用性 2.易维护 3.可扩展性强 4.类型function 定义函数: def 函数变量名(): 函数的调用: 1.函数名加括号 2.函数如果没被调用,不会去执行函数内部的 ...
- 安装Angulr CLI
参考文档 https://www.jianshu.com/p/327d88284abb http://blog.csdn.net/zhy13087344578/article/details/6074 ...
- oracle plsql登陆用户名密码都正确,拒绝登陆
先通过sqlplus 或者 sql developer 或者其他用户登陆 然后更改 登陆不上的用户的密码 然后再用plsql登陆就可以了 然后还可以再把用户密码再改回来 也可以登陆了
- jQuery方法介绍
//jQuery与JavaScript在申明变量的区别: var $variable = jQuery对象 var variable = DOM对象 $variabl[0] //jQuery对象转换成 ...
- x86和x64下指针的大小
根据测试 int main() { ; )); )); int n1 = sizeof(a); int n2 = sizeof(p); // int n3 = sizeof(*p); error in ...