web-dev-qa-db-fra.com

Pourcentage de largeur d'écran Android dans l'élément RecyclerView

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):

 enter image description here

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.

8
David Chu

À ma connaissance, il n’existe aucun moyen de faire cela en XML. Cependant, vous pouvez le faire en Java (sans Runnables 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);
}
12
Ben P.

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.

3
Khemraj

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.

2
Pawel

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.

1
Ranjan Das