问题描述:

我自定义了一个把 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不显示的问题的更多相关文章

  1. Android 自定义view(二) —— attr 使用

    前言: attr 在前一篇文章<Android 自定义view -- attr理解>已经简单的进行了介绍和创建,那么这篇文章就来一步步说说attr的简单使用吧 自定义view简单实现步骤 ...

  2. android 自定义View onMeasure中 super.onMeasure 和 setMeasuredDimension

    练习写一个自定义的view,代码是抄网上的,第一次写,没有问题,与网上的示例一样的效果, 第二次.第三次,都出现问题,但是解决了. 昨天进行第四次写再写,又出问题不一样的问题了. 首先是想加一个子包, ...

  3. Android中使用自定义View实现下载进度的显示

    一般有下载功能的应用都会有这样一个场景,需要一个图标来标识不同的状态.之前在公司的项目中写过一个,今天抽空来整理一下. 一般下载都会有这么几种状态:未开始.等待.正在下载.下载结束,当然有时候会有下载 ...

  4. 安卓自定义View实现图片上传进度显示(仿QQ)

    首先看下我们想要实现的效果如下图(qq聊天中发送图片时的效果): 再看下图我们实现的效果: 实现原理很简单,首先我们上传图片时需要一个进度值progress,这个不管是自己写的上传的方法还是使用第三方 ...

  5. Android显示框架:自定义View实践之绘制篇

    文章目录 一 View 二 Paint 2.1 颜色处理 2.2 文字处理 2.3 特殊处理 三 Canvas 3.1 界面绘制 3.2 范围裁切 3.3 集合变换 四 Path 4.1 添加图形 4 ...

  6. Android 自定义View及其在布局文件中的使用示例

    前言: 尽管Android已经为我们提供了一套丰富的控件,如:Button,ImageView,TextView,EditText等众多控件,但是,有时候在项目开发过程中,还是需要开发者自定义一些需要 ...

  7. Android自定义View初步

    经过上一篇的介绍,大家对于自定义View一定有了一定的认识,接下来我们就以实现一个图片下显示文字的自定义View来练习一下.废话不多说,下面进入我们的正题,首先看一下我们的思路,1.我们需要通过在va ...

  8. Android之自定义View的实现

    对于学习Android开发的小童鞋对于自定义View一定不会陌生,相信大家对它是又爱又恨,爱它可以跟随我们的心意设计出漂亮的效果:恨它想要完全流畅掌握,需要一定的功夫.对于初学者来说确实很不容易,网上 ...

  9. 通过圆形载入View了解自定义View

    这是自定义View的第一篇文章,通过制作简单的自定义View来了解自定义View的流程. 自定义View是Android学习和开发中必不可少的一部分.通过自定义View我们可以制作丰富绚丽的控件,自定 ...

随机推荐

  1. 编程题:求单链表倒数第k位的值(最后一位为倒数第0位)好未来

    #!/usr/bin/env python class Node(object): def __init__(self,elem,next_=None): self.elem = elem self. ...

  2. JavaScript深入理解对象方法——Object.entries()

    Object.entries()方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环也枚举原型链中的属性) 示例 ...

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-trash

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-ok

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  5. DevOps - 为什么

    章节 DevOps – 为什么 DevOps – 与传统方式区别 DevOps – 优势 DevOps – 不适用 DevOps – 生命周期 DevOps – 与敏捷方法区别 DevOps – 实施 ...

  6. Ubuntu 1804 进入紧急模式

    进入系统引导前,长按shift键:     选择第一条,按e进入编辑     添加完成后,只需按下 CTRL+x 或 F10 即可继续启动救援模式         接下来,输入以下命令将根 (/) 文 ...

  7. Linux添加虚拟内存 && 修改Linux系统语言

    Linux添加虚拟内存 首先执行free -h查看内存状况: total used free shared buff/cache available Mem: 1.8G 570M 76M 8.4M 1 ...

  8. Linux应用可通过USB访问Android设备-Chrome OS 75版发布

    导读 谷歌已经为支持的Chromebook设备发布了Chrome OS 75操作系统,这是一个主要版本,增加了各种新功能,最新安全补丁和其他改进. 对于大多数Chromebook设备,Chrome O ...

  9. 如何修改 Vmware vRealize Operations Manager Appliance root密码

    开机后,按上下键,选择 中间那一项,在底部增加:init=/bin/bash 进入单用户模式后,输入命令:# passwd root                      #修改root密码,要输 ...

  10. linux解决端口冲突问题

    # 查看9000这个端口是否被使用 netstat -lnt | grep 9000 -l       显示正在被监听(listen)的端口 -n     表示直接显示端口数字 -t      表示的 ...