• 自定义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并未真正的添加到布局中去。

  • 相关阅读:
    vue-org-tree 组织结构树插件
    vue-pdf 插件预览
    element upload 上传报错 Uncaught TypeError: Cannot set property 'status' of undefined
    element 表格回显默认选中的一行在第一行显示
    swiper轮播图(中间大,两侧小)
    elementui 树控件默认隐藏第三级菜单
    Echarts配置项详解
    elementui禁用树形结构全部复选框
    layui下拉多选formSelects使用方法
    R语言 expression函数
  • 原文地址:https://www.cnblogs.com/weimore/p/7337001.html
Copyright © 2020-2023  润新知