J'essaie d'afficher 8 éléments dans un gridview. Malheureusement, la hauteur de grille est toujours trop petite pour ne montrer que la première ligne et une petite partie de la seconde.
Réglage Android:layout_height="300dp"
le fait fonctionner. wrap _content
et fill_parent
apparemment non.
Ma vue en grille:
<GridView
Android:id="@+id/myId"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:horizontalSpacing="2dp"
Android:isScrollContainer="false"
Android:numColumns="4"
Android:stretchMode="columnWidth"
Android:verticalSpacing="20dp" />
Ma ressource en articles:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="vertical"
Android:minHeight="?android:attr/listPreferredItemHeight" >
<ImageView
Android:id="@+id/appItemIcon"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:src="@Android:drawable/ic_dialog_info"
Android:scaleType="center" />
<TextView
Android:id="@+id/appItemText"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="My long application name"
Android:gravity="center_horizontal"
Android:textAppearance="?android:attr/textAppearanceSmall" />
</LinearLayout>
La question ne semble pas liée à un manque d'espace vertical.
Que puis-je faire ?
Après (trop) de recherches, je suis tombé sur l'excellente réponse de Neil Traft .
Adapter son travail pour le GridView
a été extrêmement simple.
ExpandableHeightGridView.Java:
package com.example;
public class ExpandableHeightGridView extends GridView
{
boolean expanded = false;
public ExpandableHeightGridView(Context context)
{
super(context);
}
public ExpandableHeightGridView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public ExpandableHeightGridView(Context context, AttributeSet attrs,
int defStyle)
{
super(context, attrs, defStyle);
}
public boolean isExpanded()
{
return expanded;
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
// HACK! TAKE THAT Android!
if (isExpanded())
{
// Calculate entire height by providing a very large height hint.
// View.MEASURED_SIZE_MASK represents the largest height possible.
int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
}
else
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}
public void setExpanded(boolean expanded)
{
this.expanded = expanded;
}
}
Incluez-le dans votre mise en page comme ceci:
<com.example.ExpandableHeightGridView
Android:id="@+id/myId"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:gravity="center"
Android:horizontalSpacing="2dp"
Android:isScrollContainer="false"
Android:numColumns="4"
Android:stretchMode="columnWidth"
Android:verticalSpacing="20dp" />
Enfin, il vous suffit de lui demander d’agrandir:
mAppsGrid = (ExpandableHeightGridView) findViewById(R.id.myId);
mAppsGrid.setExpanded(true);
Après avoir utilisé la réponse de @tacone et m'être assuré que cela fonctionnait, j'ai décidé d'essayer de raccourcir le code. Ceci est mon résultat. PS: Cela revient à avoir la réponse booléenne "élargie" dans les tacones toujours définie sur true.
public class StaticGridView extends GridView {
public StaticGridView(Context context) {
super(context);
}
public StaticGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public StaticGridView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST));
getLayoutParams().height = getMeasuredHeight();
}
}
Une autre approche similaire qui a fonctionné pour moi est de calculer la hauteur d’une ligne, puis avec des données statiques (vous pouvez l’adapter à la pagination), vous pouvez calculer le nombre de lignes que vous avez et redimensionner facilement la hauteur de GridView.
private void resizeGridView(GridView gridView, int items, int columns) {
ViewGroup.LayoutParams params = gridView.getLayoutParams();
int oneRowHeight = gridView.getHeight();
int rows = (int) (items / columns);
params.height = oneRowHeight * rows;
gridView.setLayoutParams(params);
}
Utilisez ce code après avoir configuré l'adaptateur et lorsque GridView est dessiné ou vous obtiendrez height = 0.
gridView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (!gridViewResized) {
gridViewResized = true;
resizeGridView(gridView, numItems, numColumns);
}
}
});
Les tacones trouvés répondent utiles ... alors je l'ai porté en C # (Xamarin)
public class ExpandableHeightGridView: GridView
{
bool _isExpanded = false;
public ExpandableHeightGridView(Context context) : base(context)
{
}
public ExpandableHeightGridView(Context context, IAttributeSet attrs) : base(context, attrs)
{
}
public ExpandableHeightGridView(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
{
}
public bool IsExpanded
{
get { return _isExpanded; }
set { _isExpanded = value; }
}
protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
// HACK! TAKE THAT Android!
if (IsExpanded)
{
// Calculate entire height by providing a very large height hint.
// View.MEASURED_SIZE_MASK represents the largest height possible.
int expandSpec = MeasureSpec.MakeMeasureSpec( View.MeasuredSizeMask, MeasureSpecMode.AtMost);
base.OnMeasure(widthMeasureSpec,expandSpec);
var layoutParameters = this.LayoutParameters;
layoutParameters.Height = this.MeasuredHeight;
}
else
{
base.OnMeasure(widthMeasureSpec,heightMeasureSpec);
}
}
}
Il suffit de calculer la hauteur pour AT_MOST et de définir sur mesure. Ici, GridView Scroll ne fonctionnera pas ainsi. Besoin d'utiliser explicitement la vue de défilement vertical.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int heightSpec;
if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
heightSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
}
else {
// Any other height should be respected as is.
heightSpec = heightMeasureSpec;
}
super.onMeasure(widthMeasureSpec, heightSpec);
}