2017-07-21 3 views
3

J'ai un RecyclerView, pour lequel j'ai un adaptateur personnalisé, et j'ai défini le LayoutManager comme un FlexboxLayoutManager. Pour chaque enfant, je veux mettre FlexGrow à 1.RecyclerView getLayoutParams renvoie null (parfois)

Dans l'exemple de Google, démo-cat-galerie (https://github.com/google/flexbox-layout), ils le font dans le 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); 
    } 
} 

Il est ensuite appelé par le RecyclerView.Adapter dans onBindViewHolder. Cela fonctionne très bien, mais quand je faisais la même chose dans mon application, cela ne mettait queFlexGrow pour certains éléments, et jamais ceux en haut. J'ai réalisé que pour certains éléments (apparemment de manière aléatoire), getLayoutParams() renvoyait null, mais pour d'autres, il renvoyait le bon FlexboxLayoutManager.LayoutParams.

Je pris conscience de la différence est que dans l'exemple galerie Cat, onCreateViewHolder faisait

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); 
} 

alors que dans mon application, je faisais

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

Il semble que gonfler avec une référence à la parent signifie que getLayoutParams() n'est jamais nul, donc a changé mon code en

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

Et cela fonctionne maintenant correctement, setFlexGrow() étant toujours défini. Cependant, cela ne va pas - je sais que vous n'êtes pas censé ajouter explicitement des vues au parent RecyclerView.

Ma question est la suivante:

1 - Pourquoi étaient LayoutParams nulle au hasard pour certains articles, mais bien pour d'autres?

2 - Comment faire en sorte que LayoutParams soit toujours défini, sans faire quelque chose d'horrible comme 'parent.addView (v);', ou est-ce que c'est correct de le faire?

Merci :)

+0

Nvm, en fait celle ci-dessus est parfaitement bien où vous attachez le parent à la vue. –

+0

C'est bon à savoir, merci :) – Luke

Répondre

0

Cela semble être un bug avec FlexboxLayoutManager. J'ai essayé de faire

parent.addView(v); 

Mais cela a produit des accidents très étranges. En fin de compte, je produit ce travail autour de:

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