web-dev-qa-db-fra.com

Problèmes avec GridView dans ScrollView dans android

J'essaie de mettre le GridView dans ScrollView dans Android. Quand je mets le GridView ne fonctionne pas.

Voici la mise en page.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/scroll_home"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <RelativeLayout 
            Android:id="@+id/layout_home" 
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content">       

              <GridView xmlns:Android="http://schemas.Android.com/apk/res/Android"
                Android:id="@+id/programacao_grid"
                Android:numColumns="auto_fit"
                Android:gravity="center"
                Android:columnWidth="50dp"
                Android:stretchMode="columnWidth"
                Android:layout_width="fill_parent"
                Android:layout_height="fill_parent"
                Android:layout_below="@+id/calendario_programacao"
             >       
            </GridView> 

    </RelativeLayout>

</ScrollView>

Après de nombreuses recherches, la réponse a été trouvée et elle est ci-dessous

20
Igor Ronner

Après la recherche, j'ai trouvé ce projet lien : -

ExpandableHeightGridView classe

package xx.xxx.xx.view;

import Android.content.Context;
import Android.util.AttributeSet;
import Android.view.ViewGroup;
import Android.widget.GridView;

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;
} }

layout.xml fichier:

<ScrollView
    Android:id="@+id/sc_spots"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:fillViewport="true" >


        <xx.xxx.xx.view.ExpandableHeightGridView
            Android:id="@+id/spotsView"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:layout_marginTop="15dp"
            Android:layout_marginBottom="15dp"
            Android:layout_marginLeft="5dp"
            Android:layout_marginRight="5dp"
            Android:horizontalSpacing="10dp"
            Android:isScrollContainer="false"
            Android:numColumns="5"
            Android:stretchMode="columnWidth"
            Android:verticalSpacing="10dp" />
 </ScrollView>

Utilisation de la classe GridView

mGridView = (ExpandableHeightGridView)
getView().findViewById(R.id.spotsView);
mGridView.setExpanded(true);
SpotsAdapter adapter = new SpotsAdapter(getActivity(),R.layout.spot_item,params);
mGridView.setAdapter(adapter);
adapter.notifyDataSetChanged();
76
Igor Ronner

Cela fonctionne pour moi

   // Setting on Touch Listener for handling the touch inside ScrollView

       gridView.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        v.getParent().requestDisallowInterceptTouchEvent(true);
                        return false;
                    }

                });
9
Tharindu Bandara

Juste pour mentionner que, la solution fournie par @Igor Ronner est excellente, mais a quand même fait la moitié de mon application pour une raison inconnue - dans une vue de défilement, la vue de la grille est à plat comme si elle n'existait pas du tout.

Cela m'a pris près d'une demi-journée avec de nombreuses tentatives pour remplir l'autre moitié - utilisez une disposition relative pour envelopper la vue de la grille pour la laisser se développer automatiquement, comme ceci (le code réel qui fonctionne finalement pour moi !!!):

<RelativeLayout
    Android:id="@+id/grid_view_box"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/text_catalog"
    >

    <com.takken.app.Android.component.framework.ExpandableGridView
        Android:id="@+id/grid_view"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:numColumns="2"
        Android:horizontalSpacing="12dp"
        Android:verticalSpacing="12dp"
        />

</RelativeLayout>
0
Stephen Liu