Comment puis-je obtenir une hauteur d'élément d'un RecyclerView représentant, par exemple, 30% de la hauteur de l'écran?
Je ne peux pas simplement utiliser ConstraintLayout ou PercentFrameLayout/PercentRelativeLayout, car ces modèles positionnent les modèles enfant par rapport aux modèles parent, dont la taille peut ne pas correspondre à celle des écrans.
De préférence, j'aimerais le faire en XML pur (sans avoir à utiliser de Runnables pour obtenir la hauteur de l'écran de manière dynamique).
MODIFIER
Pour clarifier, étant donné que de nombreuses solutions suggèrent de limiter la hauteur de RecyclerView, ce n'est pas l'intention. RecyclerView devrait toujours remplir l'écran. Voici ce dont je parle, en utilisant la largeur de l'écran (au lieu de la hauteur):
L'idée est de obtenir que la largeur de la carte soit égale à 33% de la largeur de l'écran, tout en conservant la largeur de RecyclerView inchangée lors du défilement horizontal de l'écran.
À ma connaissance, il n’existe aucun moyen de faire cela en XML. Cependant, vous pouvez le faire en Java (sans Runnable
s etc.) en définissant votre ViewHolder
's itemView
's LayoutParams
avant de renvoyer ViewHolder
dans la méthode onCreateViewHolder()
de votre adaptateur:
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.itemview, parent, false);
ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams();
layoutParams.height = (int) (parent.getHeight() * 0.3);
itemView.setLayoutParams(layoutParams);
return new MyViewHolder(itemView);
}
Vous ne pouvez pas définir le pourcentage de hauteur d'élément par XML uniquement. Raison d'être c'est un élément qui sera gonflé au moment de l'exécution, ce n'est pas une activité comme disposition. Ce que vous écrivez dans votre XML.
Alors maintenant, je vous dis deux façons d'atteindre le pourcentage/poids
1ère manière préférée consiste à remplacer la hauteur par la méthode onCreateViewHolder()
dans votre Adapter
private int height = 0; // declared height globally in Adapter class to reuse it.
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
if (height == 0)
height = (int) (parent.getMeasuredHeight() * .3);
itemView.setMinimumHeight(height);
return new ItemViewHolder(itemView);
}
2nd Hack est pour utiliser SDP bibliothèque.
Utilisez la hauteur d'élément dans XML dans sdp
say _160sdp
. Il ne vous donnera pas des résultats exacts de 30%. Mais il peut s'ajuster en fonction de l'écran.
Vous pouvez remplacer l'une des méthodes LayoutManager
utilisées par votre RecyclerView
pour forcer une taille spécifique:
recyclerView.setLayoutManager(new LinearLayoutManager(this){
@Override
public boolean checkLayoutParams(RecyclerView.LayoutParams lp) {
// force height of viewHolder here, this will override layout_height from xml
lp.height = getHeight() / 3;
return true;
}
});
En supposant que votre RecyclerView
corresponde à l’écran.
Vous pouvez utiliser les métriques d'affichage
Définissez les métriques d'affichage dans le constructeur ou utilisez une autre initialisation de méthode statique.
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Maintenant, vous pouvez l'utiliser dans onCreateViewHolder ()
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
//setting the height programmatically
itemView.getLayoutParams().height = metrics.heightPixels/3;
itemView.requestLayout();
Ou Vous pouvez utiliser dans onBindViewHolder () sur la disposition parente de la disposition.