自定义View不显示的问题
Posted 微啊微末
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义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不显示的问题的主要内容,如果未能解决你的问题,请参考以下文章