自定义View不显示的问题
问题描述:
我自定义了一个把 SwipeRefreshLayout 和 RecyclerView 封装在一起的 View ,但是发现 List 不能正常的显示出来,本以为是数据源出现问题,debug了之后发现是 RecycylerView 的 getItemCount() 方法没有被调用,google了一下发现网上出现这种问题的大多数是没写 LayoutMananger ,但我确实有写。一般如果你给 recyclerView 添加了 adapter,Adapter 的 getItemCount() 就应该被调用,所以我考虑是否是因为写布局时出现了什么问题,导致了 View 未能显示不出来。后来发现是自定义 View 在 inflate 是出了问题
我原先是这样写的
View v=LayoutInflater.from(context).inflate(R.layout.widget_pulltorefresh_recycler,null);
未出现错误提示,但是自定义的View一直显示不出来。
后来的写法是
View v=LayoutInflater.from(context).inflate(R.layout.widget_pulltorefresh_recycler,(ViewGroup) getRootView(),true);
或者
View v=LayoutInflater.from(context).inflate(R.layout.widget_pulltorefresh_recycler,this);
这样View才能正常显示。
问题解析:
LayoutInflater的inflate()方法既可以传入两个参数,也可以传入三个参数
inflate(int resource, ViewGroup root)
inflate(int resource, ViewGroup root, boolean attachToRoot)
它的调用效果如下
public View inflate(int resource, ViewGroup root) {
//如果root不为null,attachToRoot为true,否则attachToRoot为false
return inflate(resource, root, root != null);
}
也就是说如果调用的是两个参数的方法,第三个参数的值由第二个参数是否为空所决定。
下面说一下各个参数的意义,首先第一个参数不用多说,传入的就是你想要获取的 layout 的资源id,后面两个参数意义如下:
ViewGroup root:指实例的布局所要放入的根视图。
boolean attachToRoot:指是否附加到传入的根视图。
上面的说明你可能看不懂,简单的说:
root参数 就是用来指定你想要将View放入哪一个父布局(或根布局),attatchToRoot参数用来决定是否要真正的放入到父布局中。
1.如果你想要把自己自定义的View放到某个layout中,那 root 参数就不能为空,并且attatchToRoot参数也必须为true(如果是调用两个参数的方法,直接使root不为空即可)。
2.如果你的 root 不为空,但是第三个参数attachToRoot为false,那么你的View并未被添加到父 layout 中,但是他能让你的 View 在xml中设置的最外层的layout_width属性和layout_height属性起作用。
我之前犯的错误就是未指定父布局,导致View并未真正的添加到布局中去。
自定义View不显示的问题的更多相关文章
- Android 自定义view(二) —— attr 使用
前言: attr 在前一篇文章<Android 自定义view -- attr理解>已经简单的进行了介绍和创建,那么这篇文章就来一步步说说attr的简单使用吧 自定义view简单实现步骤 ...
- android 自定义View onMeasure中 super.onMeasure 和 setMeasuredDimension
练习写一个自定义的view,代码是抄网上的,第一次写,没有问题,与网上的示例一样的效果, 第二次.第三次,都出现问题,但是解决了. 昨天进行第四次写再写,又出问题不一样的问题了. 首先是想加一个子包, ...
- Android中使用自定义View实现下载进度的显示
一般有下载功能的应用都会有这样一个场景,需要一个图标来标识不同的状态.之前在公司的项目中写过一个,今天抽空来整理一下. 一般下载都会有这么几种状态:未开始.等待.正在下载.下载结束,当然有时候会有下载 ...
- 安卓自定义View实现图片上传进度显示(仿QQ)
首先看下我们想要实现的效果如下图(qq聊天中发送图片时的效果): 再看下图我们实现的效果: 实现原理很简单,首先我们上传图片时需要一个进度值progress,这个不管是自己写的上传的方法还是使用第三方 ...
- Android显示框架:自定义View实践之绘制篇
文章目录 一 View 二 Paint 2.1 颜色处理 2.2 文字处理 2.3 特殊处理 三 Canvas 3.1 界面绘制 3.2 范围裁切 3.3 集合变换 四 Path 4.1 添加图形 4 ...
- Android 自定义View及其在布局文件中的使用示例
前言: 尽管Android已经为我们提供了一套丰富的控件,如:Button,ImageView,TextView,EditText等众多控件,但是,有时候在项目开发过程中,还是需要开发者自定义一些需要 ...
- Android自定义View初步
经过上一篇的介绍,大家对于自定义View一定有了一定的认识,接下来我们就以实现一个图片下显示文字的自定义View来练习一下.废话不多说,下面进入我们的正题,首先看一下我们的思路,1.我们需要通过在va ...
- Android之自定义View的实现
对于学习Android开发的小童鞋对于自定义View一定不会陌生,相信大家对它是又爱又恨,爱它可以跟随我们的心意设计出漂亮的效果:恨它想要完全流畅掌握,需要一定的功夫.对于初学者来说确实很不容易,网上 ...
- 通过圆形载入View了解自定义View
这是自定义View的第一篇文章,通过制作简单的自定义View来了解自定义View的流程. 自定义View是Android学习和开发中必不可少的一部分.通过自定义View我们可以制作丰富绚丽的控件,自定 ...
随机推荐
- linux中df和du查看磁盘大小不一致解决方法
挂了一块50G到/data目录下# df -h Filesystem Size Used Avail Use% Mounted on /dev/xvdb1 50G 46G 1.2G 98% /dat ...
- Oracle修改密码
1. 登陆oracle sqlplus '/as sysdba' 2. 修改密码 ALTER USER 用户名IDENTIFIED BY 要修改的密码 ; 3.解锁 alter user 用户名 ac ...
- ng-trim
最近新做了一个需求,要求在angular.js的input 文本框中做到去除首尾空格,实现精确查询. 查了很多正则表达式,后来才发现angular.js项目中默认就能去除首尾空格,ng-trim 默 ...
- php 获取时间段
switch ($type){ case 'day'://当日 $end=date(,,,date(,date('Y'))); $where=' and '.$pre.'create_time> ...
- Spring的JDBC的使用(配置和CRUD)
导包: Spring的JDBC模板的使用 一.默认连接池 创建数据库 create database spring4; use spring4; create table account(id int ...
- Git设置ssh密钥
前提条件是,公司的gitlab,运维没有关闭ssh的权限获取,或者叫运维开通那个ssh权限,生成的公钥要给运维那边一个!这样设置是可以成功 一.创建ssh key 1.在客户端查看有没有密钥 cd ~ ...
- 08 SSM整合案例(企业权限管理系统):05.SSM整合案例的基本介绍
04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户和角色操作 10.权限关联 11.AOP日志 05.SSM整合案例的基本介绍 ...
- 04 MySQL数据类型
MySQL支持的数据类型 1.数值类型: a.整数类型 TINYINT 1字节 有符号(-128~127); 无符号(0~255) SMALLINT 2字节 有符号(-3276 ...
- Mac安装软件提示破损
安装提示破损 zhong终端输入 sudo spctl --master-disable 就可以顺利打开啦
- CAN通讯基本设置
A节点pelican协议下,扩展帧 单滤波方式 A节点的接收滤波器 ID号 设置为 0x19881205 设置过程 (1) pelican模式设置 设置时钟分频寄存器CDR.7 =1 使SJA1000 ...