1. 程式人生 > >自定義View不顯示的問題

自定義View不顯示的問題

idt 不能 pre 寫法 是否為空 錯誤提示 recycler tac fresh

問題描述:

我自定義了一個把 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不顯示的問題