我有一个RecyclerView,我有一个自定义适配器,我已将LayoutManager设置为FlexboxLayoutManager。对于每个孩子,我想将FlexGrow设置为1。
在Google的示例中,demo-cat-gallery(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);
}
}
然后由onBindViewHolder中的RecyclerView.Adapter调用。这样可以正常工作,但是当我在我的应用程序中执行相同操作时,它只会为某些项目设置ForFlexGrow,而从不设置顶部的项目。我意识到对于某些项目(看似随机),getLayoutParams()返回null,但对于其他项目,它返回正确的FlexboxLayoutManager.LayoutParams。
我意识到不同之处在于,在Cat-gallery示例中,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()));
}
似乎用父对引用进行膨胀意味着getLayoutParams()永远不会为null,所以我的代码改为
View v = new MyCustomView(getContext());
parent.addView(v);
return new MyViewHolder(v);
现在它正常工作,总是设置setFlexGrow()。但是,这感觉不对 - 我知道您并不打算明确地向RecyclerView父级添加视图。
所以我的问题是:
1 - 为什么LayoutParams对某些项目随机为null,但对其他项目则没有问题?
2 - 我怎样才能让LayoutParams始终被设置,而不会做像'parent.addView(v);'这样可怕的事情,或者这样做真的没问题吗?
谢谢:)
答案 0 :(得分:1)
这似乎是FlexboxLayoutManager的一个错误。我试着做了
parent.addView(v);
但是这产生了非常奇怪的崩溃。 最后我制作了这个解决方法:
parent.addView(v);
ViewGroup.LayoutParams params = v.getLayoutParams();
parent.removeView(v);
v.setLayoutParams(params);