自定义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不显示的问题的主要内容,如果未能解决你的问题,请参考以下文章

在片段活动中显示自定义对话框

自定义View不显示的问题

android自定义列表适配器不显示项目

JavaFX自定义窗口标题栏

片段内的自定义列表不起作用

Android:在片段内膨胀自定义视图