2017-07-21 122 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); 
相关问题