RecyclerView子View不刷新(RequestLayout无效),RecyclerView.mEatRequestLayout
问题:
最近项目中发现,有时候recyclerView刷新了数据后,部分ItemView里的文字出现被截断的问题,或者是如果textView支持过长打点的话,出现提前打点,也就是文字长度还未超出限定范围就开始打点了。
问题分析:
android中,View的内容如果发生改变,导致内容超出当前View的宽高范围,需要重新请求视图树进行测量和布局,也就是调用requestLayout。如TextView的setText方法,ImageView的setImageResource,View的setLayoutParams方法。
问题原因可能是textView的setText方法未引起视图树的重新测量和布局,尝试在setText后,手动调用textView的requestLayout方法,请求刷新视图树。但是某些情况下,特别是首次刷新数据时候,还是会出现文字被剪断问题。
考虑是否是textView向上请求requestLayout被某一个ViewGroup给拦截了。
先分析view的requestLayout是如何传递给RootViewImpl的。
view调用requestLayout之后,会调用parent布局的requestLayout,parent布局又会再调用其parent布局的requestLayout,递归直到ViewRootImpl,并把沿途经过的所有View都标记上PFLAG_FORCE_LAYOUT、PFLAG_INVALIDATED这两个Flag,那么在下一次VSync(16ms一次)到来的时候,将会重新计算和布局所有标记了PFLAG_FORCE_LAYOUT的View,也就是onMeasure和onLayout方法将被调用,接着draw所有标记了PFLAG_INVALIDATED的View,也就是draw方法将被调用。
我重写了textView的onLayout方法,发现,requestLayout后,textView的onLayout并没有执行。
也就是说ViewRootImpl并没有收到textView的requestLayout请求,所以说,是被某一个ViewGroup给拦截了。
之后,使用排除法,从视图树的顶部往下走,挨个调用requestLayout,看看它的onLayout方法是否执行,当尝试到内部的那个recyclerView的时候,发现,其requestLayout也失效了,也就是说外层的RecyclerView消费了所有孩子View的requestLayout请求。
查看RecyclerView的requestLayout方法源码:
public void requestLayout() {if(!this.mEatRequestLayout) {super.requestLayout();} else {this.mLayoutRequestEaten = true;}
}
如果变量mEatRequestLayout为true的话,拦截requestLayout的向上传递。
如此一来,只要重写外层recyclerView的requestLayout方法,在调用super.requestLayout方法之前,使用反射将mEatRequestLayout设置成false即可。
是否导致其他问题:
目前来看,没出现其他问题。但是性能上可能会有一些问题,RecyclerView之所以要消费requestLayout请求,一定有其原因,具体还未进行分析。
RecyclerView子View不刷新(RequestLayout无效),RecyclerView.mEatRequestLayout相关推荐
- 自定义Group,解决Group setVisibility后,子View再次设置setVisibility无效的问题
前言 平时我们在使用被ConstraintLayout包裹的Group时,会遇到这样一个问题:设置Group的 app:constraint_referenced_ids="view_1, ...
- Android 曝光采集,商品view曝光量的统计,判断RecyclerView中某子view是否可见 view是否显示在屏幕中 view展示次数统计...
近期pm提出需要统计首页商品的曝光亮,由于我们的首页是用的recylerview实现的,这里就来讲下如何使用监听recylerview的滚动事件来实现子view的曝光量统计,我们这里说的view都是列 ...
- android电脑文件列表不刷新,Android 利用RecyclerView.Adapter刷新列表中的单个view问题...
首先使用RecyclerView的adapter继承:RecyclerView.Adapter public class OrderListAdapter extends RecyclerView.A ...
- 采用SwipeFreshLayout+Recyclerview实现下拉刷新和上拉加载更多以及CoordinatorLayout的引入
之前都是采用PullToRefresh进行下拉刷新和下拉加载,现在采用谷歌自己的控件SwipeFreshLayout,配合Recyclerview来实现这一效果.使用SwipeRefreshLayou ...
- 为RecyclerView添加下拉刷新(PullToRefresh)功能
在之前的文章中,我们实现了带有header和footer功能的WrapRecyclerView. 实现带header和footer功能的RecyclerView 实现带header和footer功能的 ...
- android 下拉刷新实现方式,Android RecyclerView设置下拉刷新的实现方法
Android RecyclerView设置下拉刷新的实现方法 1 集成 SwipeRefreshLayout 1.1 xml布局文件中使用 android:id="@+id/refresh ...
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
下拉刷新和上拉刷新都用SwipeRefreshLayout 自带的进度条 布局 <?xml version="1.0" encoding="utf-8"? ...
- android 设置下拉刷新,Android RecyclerView设置下拉刷新的实现方法
Android RecyclerView设置下拉刷新的实现方法 1 集成 SwipeRefreshLayout 1.1 xml布局文件中使用 android:id="@+id/refresh ...
- MVP+OKHttp+Recyclerview+Springview下拉刷新上拉加载
//activity -main布局 依赖 compile 'com.android.support:recyclerview-v7:25.0.0-alpha1' //springview实现上下拉的 ...
- android layoutinflater 高度,探究LayoutInflater和RecyclerView中item设置宽高无效
1. LayoutInflater是做什么的 Instantiates a layout XML file into its corresponding {@link android.view.Vie ...
最新文章
- ipsec NAT-T与穿透
- 用栈和递归求解迷宫问题
- 提高机器学习质量的想法_如何提高机器学习的数据质量?
- 安装angular cli_Angular 9适用于初学者—如何使用Angular CLI安装第一个应用程序
- geoserver native JAI error 问题解决方法
- 计算概论(A)/基础编程练习1(8题)/3:晶晶赴约会
- 简述工业机器人示教再现的一般步骤_基于激光焊缝跟踪传感器的工业机器人焊缝跟踪系统的应用焊接寻位...
- tensorflow分类的loss函数_tensorflow中loss函数
- Microsoft® Deployment Toolkit 2010之快速部署Windows 7
- Android--多选自动搜索提示
- Jmeter初探之录制
- 【AWVS12】安全漏洞扫描工具,使用详解
- python获取像素值_从PIL获取像素值列表
- linux 使用 雅黑字体,linux 使用微软雅黑字体
- rows是横着的还是cols_rows和cols到底哪个是列哪个是行
- 什么是扇入?什么是扇出?
- Vue、ElementUI
- 视线估计14个常见数据集下载
- 省市区地址三级联动jQuery插件Distpicker使用
- 阿里云和腾讯云香港服务器区别及如何选择?