自定義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 returninflate(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不顯示的問題