RecyclerView getLayoutParams返回null(有时)

时间:2017-07-21 16:41:51

标签: android android-recyclerview layoutparams

我有一个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);'这样可怕的事情,或者这样做真的没问题吗?

谢谢:)

1 个答案:

答案 0 :(得分:1)

这似乎是FlexboxLayoutManager的一个错误。我试着做了

parent.addView(v);

但是这产生了非常奇怪的崩溃。 最后我制作了这个解决方法:

parent.addView(v);
ViewGroup.LayoutParams params = v.getLayoutParams();
parent.removeView(v);
v.setLayoutParams(params);