我有一个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);'那样做一些可怕的事情,还是实际上这样做可以吗?
谢谢:)
NVM,实际上上述一个是完全没有你在哪里附接母体到视图。 –
很高兴知道,谢谢:) – Luke