web-dev-qa-db-fra.com

Comment régler RecyclerView Max Height

Je souhaite définir la hauteur maximale de RecylerView.Je peux définir la hauteur maximale à l'aide du code ci-dessous. Le code ci-dessous fait une hauteur de 60% de l'écran actuel.

     DisplayMetrics displaymetrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    int a = (displaymetrics.heightPixels * 60) / 100;
    recyclerview1.getLayoutParams().height = a;

Mais maintenant, le problème est que, s’il n’a pas d’article, sa hauteur est également de 60% . Je souhaite donc définir sa hauteur 0 si aucun article n’y figure.

Je veux réaliser comme quelque chose.

    if(recyclerview's height > maxHeight)
then set recyclerview's height to maxHeight
    else dont change the height of recyclerview.

Comment puis-je le régler? S'il vous plaît aidez-moi, je suis coincé avec elle

14
maulikdhameliya

Voici quelque chose dont vous avez besoin. Sous-classez le RecyclerView et remplacez onMeasure comme suit:

@Override
protected void onMeasure(int widthSpec, int heightSpec) {
    heightSpec = MeasureSpec.makeMeasureSpec(Utils.dpsToPixels(240), MeasureSpec.AT_MOST);
    super.onMeasure(widthSpec, heightSpec);
}

Assurez-vous de donner le nombre correct de pixels comme premier argument de makeMeasureSpec(). J'ai personnellement besoin de RecyclerView, c'est-à-dire 240dps au maximum.

29
Fattum

Nous pouvons optimiser un peu la méthode de @Fattum . Nous pouvons utiliser app:maxHeight pour définir maxHeight. On peut utiliser dp ou px comme bon vous semble.

public class MaxHeightRecyclerView extends RecyclerView {
    private int mMaxHeight;

    public MaxHeightRecyclerView(Context context) {
        super(context);
    }

    public MaxHeightRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialize(context, attrs);
    }

    public MaxHeightRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initialize(context, attrs);
    }

    private void initialize(Context context, AttributeSet attrs) {
        TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
        mMaxHeight = arr.getLayoutDimension(R.styleable.MaxHeightScrollView_maxHeight, mMaxHeight);
        arr.recycle();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (mMaxHeight > 0) {
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxHeight, MeasureSpec.AT_MOST);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

valeurs/attrs.xml

<declare-styleable name="MaxHeightScrollView">
    <attr name="maxHeight" format="dimension" />
</declare-styleable>
10
Francis Bacon

ConstraintLayout offre une hauteur maximale à ses enfants.

<Android.support.constraint.ConstraintLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <ListView
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:scrollbars="vertical"
        app:layout_constrainedHeight="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_max="300dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</Android.support.constraint.ConstraintLayout>
9
user1506104

écrivez cette déclaration à l'intérieur de if else et laisse moi savoir ,

ViewGroup.LayoutParams params=recyclerview.getLayoutParams();
params.height=100;
recyclerview.setLayoutParams(params);
3
Radhey

Vous pouvez utiliser WRAP_CONTENT dans votre RecyclerView. Il mesurera automatiquement votre liste de recyclage en fonction de son contenu. 

Vous pouvez également calculer la hauteur actuelle et définir la hauteur maximale. Donc, Recyclerview utilisera la valeur de l'attribut wrap_content jusqu'à hauteur maximale.

public static void getTotalHeightofRecyclerView(RecyclerView recyclerView) {

        RecyclerView.Adapter mAdapter = recyclerView.getAdapter();

        int totalHeight = 0;

        for (int i = 0; i < mAdapter.getItemCount(); i++) {
            View mView = recyclerView.findViewHolderForAdapterPosition(i).itemView

            mView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

            totalHeight += mView.getMeasuredHeight();
        }

        if (totalHeight > 100) {
            ViewGroup.LayoutParams params = recyclerView.getLayoutParams();
            params.height = 100;
            recyclerView.setLayoutParams(params);
        }
    }
1
mertsimsek

Si vous avez un RecyclerView conçu pour contenir des éléments de taille physique identique et que vous souhaitez limiter de manière évidente sa hauteur sans prolonger RecyclerView, essayez ceci:

int maxRecyclerViewHeightPixels = (int) TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP,
    MAX_RECYCLERVIEW_HEIGHT_DP,
    getResources().getDisplayMetrics()
);

MyRecyclerViewAdapter myRecyclerViewAdapter = new MyRecyclerViewAdapter(getContext(), myElementList);
myRecyclerView.setAdapter(myRecyclerViewAdapter);

ViewGroup.LayoutParams params = myRecyclerView.getLayoutParams();

if (myElementList.size() <= MAX_NUMBER_OF_ELEMENTS_TO_DISPLAY_AT_ONE_TIME) {
    myRecyclerView.setLayoutParams(new LinearLayout.LayoutParams(
         LinearLayout.LayoutParams.MATCH_PARENT,
         LinearLayout.LayoutParams.WRAP_CONTENT));
    //LinearLayout must be replaced by whatever layout type encloses your RecyclerView
}
else {
    params.height = maxRecyclerViewHeightPixels;
    myRecyclerView.setLayoutParams(params);
}

Cela fonctionne à la fois pour Linear et Grid RecyclerViews, il vous suffit de jouer avec les chiffres un peu à votre goût. N'oubliez pas de définir la hauteur sur WRAP_CONTENT après avoir rempli le fichier RecyclerView.

Vous devrez peut-être également redéfinir la hauteur chaque fois que la taille de myElementList change, mais ce n'est pas un gros problème.

0
BarLr

Le moyen le plus simple consiste à utiliser ConstraintLayout et à définir une contrainte de hauteur sur Recycleview.

<Android.support.constraint.ConstraintLayout
    Android:id="@+id/CL_OUTER_RV_Choose_Categories "
    Android:layout_width="match_parent"
    Android:layout_height="200dp">

   <Android.support.v7.widget.RecyclerView
        Android:id="@+id/RV_Choose_Categories"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:scrollbars="vertical"
        app:layout_constrainedHeight="true" >
    </Android.support.v7.widget.RecyclerView>

</Android.support.constraint.ConstraintLayout>

Veuillez noter qu'avant Lollipop, le recycleview ne défilera pas. En guise de solution, ajoutez le code ci-dessous dans l'activité de création.

if (Android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.Lollipop) {
        ConstraintLayout CL_OUTER_RV_Choose_Categories = findViewById(R.id.CL_OUTER_RV_Choose_Categories);
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) CL_OUTER_RV_Choose_Categories.getLayoutParams();
        lp.height = LinearLayout.LayoutParams.WRAP_CONTENT;
    }

Cela garantira que la hauteur est fixée uniquement sur les périphériques pris en charge et que la vue de recyclage complet est affichée sur les périphériques plus anciens.

Faites-moi savoir s'il y a une meilleure façon.

0
mstoic