web-dev-qa-db-fra.com

Comment définir la hauteur d'une ligne d'élément dans GridLayoutManager

Current View is

Mon article de recyclage qui se gonfle dans onCreateViewHolder

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:gravity="center"
    Android:orientation="vertical"
    Android:padding="16dp">

    <ImageView
        Android:id="@+id/gridListImageView"
        Android:layout_width="96dp"
        Android:layout_height="96dp"
        Android:src="@drawable/a" />

    <TextView
        Android:id="@+id/gridListView_title"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="20dp"
        Android:text="Large Text"
        Android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>

Je veux afficher quelque chose comme ceci Qui a une rangée de la moitié de la hauteur du recycleur Voir? Et ajouter du rembourrage au reste de l'espace? Puis-je faire cela par GridLayoutManager?

Et voici mon GridLayoutManager

        GridLayoutManager glm = new GridLayoutManager(getActivity(), 2);
        recyclerView.setLayoutManager(glm);
21
Kunal

Lorsque vous gonflez la présentation de vos vues dans l'adaptateur, vous pouvez définir leur hauteur par programmation. Pour évaluer la hauteur appropriée à utiliser, vous pouvez vous fier au ViewGroup parent (c'est-à-dire le RecyclerView lui-même). Voici un exemple:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = mLayoutInflater.inflate(R.layout.view_item, parent, false);
    // work here if you need to control height of your items
    // keep in mind that parent is RecyclerView in this case
    int height = parent.getMeasuredHeight() / 4;
    itemView.setMinimumHeight(height);
    return new ItemViewHolder(itemView);        
}

J'espère que cela pourrait aider.

57
thetonrifles

À compter de la bibliothèque de support 25.1.0, LA RÉPONSE CI-DESSUS NE FONCTIONNE PAS. Je suggère ci-dessous des modifications:

    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
        GridLayoutManager.LayoutParams lp = (GridLayoutManager.LayoutParams) v.getLayoutParams();
        lp.height = parent.getMeasuredHeight() / 4;
        v.setLayoutParams(lp);
        return new ViewHolder(v);
    }
13
abedfar

Vous n'avez pas besoin de définir la hauteur d'un élément. Le problème ici est que l’image essaie de remplir tout l’espace. Ajoutez simplement Android:adjustViewBounds="true" sur votre ImageView et il ne sera pas ajouter des espaces

8
Valentina Konyukhova
v.getLayoutParams().width = parent.getMeasuredWidth() / 2;

v.getLayoutParams().height = parent.getMeasuredWidth() / 2;
8
Pranav Goswami

parfois, obtenir la taille de la vue de gonflage dans le retour de l’adaptateur égal à 0 ou négatif. Une autre approche consiste à obtenir la taille requise de l’adaptateur, à le manipuler et à le visualiser. dans mon cas, un autre problème était la taille sans effet. donc je règle la taille en utilisant le paramètre de mise en page

voici mon adaptateur en activité:

Display display = MainActivity.this.getWindowManager().getDefaultDisplay();
                    Point size = new Point();
                    display.getSize(size);
                    int  y = size.y;
                    y=(int)y/2;
 GridLayoutManager linearLayoutManager = new GridLayoutManager(MainActivity.this,2);
                    recyclerView.setLayoutManager(linearLayoutManager);
                    NewOrderAdapter newOrderAdapter=new NewOrderAdapter(MainActivity.this,arrayListname,arrayListimage,y);
                    recyclerView.setAdapter(newOrderAdapter);

et je règle la taille de la vue comme ceci:

@Override
    public myviewholder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = inflator.inflate(R.layout.new_order_row, viewGroup, false);
        GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) view.getLayoutParams();
        params.height = ysize;
        view.setLayoutParams(params);
        myviewholder holder = new myviewholder(view);
        return holder;
    }

et n'oubliez pas de définir une hauteur de mise en page dans votre mise en page pour l'initialisation

3
iman kazemayni

Sur un niveau récent d'API actuellement 25, la hauteur du recycleur dans onCreateViewHolder est toujours vide. Cet extrait sert à définir la hauteur après l'appel de la vue recycleur onMeasure et à définir la hauteur correcte pour la vue liste gonflée.

@Override
public DataBindingViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
    // You may inflate your view here.
    parent.post(new Runnable() {

        @Override
        public void run() {
            int height = parent.getMeasuredHeight() / rows;
            View view = holder.getBinding().getRoot();
            view.getLayoutParams().height = height;
        }
    });
    return holder;
}
2
drindt

Ceci est mon code pour ajuster la hauteur de l'élément de la vue de recyclage en fonction de l'aspect réel requis.

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.adapter_offers, parent, false);

    int width =  parent.getMeasuredWidth();
    float height = (float) width / Config.ASPECT_RATIO;//(Width/Height)
    RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) itemView.getLayoutParams();
    params.height = Math.round(height);
    itemView.setLayoutParams(params);
    return new MyViewHolder(itemView);
}
2
Vinil Chandran