2017-07-21 120 views
3

我有一個RecyclerView,爲此我有一個自定義適配器,並且我已經將LayoutManager設置爲FlexboxLayoutManager。對於每一個孩子,我想設置FlexGrow爲1RecyclerView getLayoutParams返回null(有時)

在谷歌的例子,演示貓畫廊(https://github.com/google/flexbox-layout),他們這樣做的ViewHolder:

void bindTo(Drawable drawable) { 
    mImageView.setImageDrawable(drawable); 
    ViewGroup.LayoutParams lp = mImageView.getLayoutParams(); 
    if (lp instanceof FlexboxLayoutManager.LayoutParams) { 
     FlexboxLayoutManager.LayoutParams flexboxLp = (FlexboxLayoutManager.LayoutParams) lp; 
     flexboxLp.setFlexGrow(1.0f); 
    } 
} 

這隨後被稱爲RecyclerView.Adapter在onBindViewHolder中。這工作正常,但當我在我的應用程序中做同樣的事情時,它只會爲某些項目設置FlexGrow,而不會在頂部設置FlexGrow。我意識到對於某些項目(看似隨機),getLayoutParams()返回null,但對於其他項目,它返回正確的FlexboxLayoutManager.LayoutParams。

我意識到了差異,在貓畫廊例如,onCreateViewHolder在做

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
{ 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.viewholder_cat, parent, false); 
    return new CatViewHolder(view); 
} 

,而在我的應用我在做

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
{ 
    return new MyViewHolder(new MyCustomView(getContext())); 
} 

似乎與該參考膨脹parent意味着getLayoutParams()不會爲null,因此將代碼更改爲

View v = new MyCustomView(getContext()); 
parent.addView(v); 
return new MyViewHolder(v); 

現在它正常工作,setFlexGrow()總是被設置。但是,這感覺不對 - 我知道你不打算向RecyclerView父項顯式添加視圖。

所以我的問題是:

1 - 爲什麼是隨機的LayoutParams空對某些項目,但罰款別人?

2 - 我怎樣才能讓LayoutParams始終處於設置狀態,而不會像'parent.addView(v);'那樣做一些可怕的事情,還是實際上這樣做可以嗎?

謝謝:)

+0

NVM,實際上上述一個是完全沒有你在哪裏附接母體到視圖。 –

+0

很高興知道,謝謝:) – Luke

回答

0

這似乎是FlexboxLayoutManager的一個錯誤。我試過

parent.addView(v); 

但是這樣做產生了很奇怪的崩潰。 最後,我生成此變通:

parent.addView(v); 
ViewGroup.LayoutParams params = v.getLayoutParams(); 
parent.removeView(v); 
v.setLayoutParams(params); 
相關問題