2015-06-15 9 views
6

Ho dichiarato GirdView in formato xml come mostrato di seguito.In Android, come posso mantenere verticalSpacing sempre uguale a horizontalSpacing in GridView?

<GridView 
    android:id="@+id/movies_gridview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:drawSelectorOnTop="true" 
    android:columnWidth="92dp" 
    android:numColumns="auto_fit" 
    android:stretchMode="spacingWidthUniform" 
    android:gravity="center_horizontal" /> 

intendo mostrare immagini di dimensione fissa (rettangolo verticale non quadrato) in questo GridView. Ho impostato il columnWidth a auto_fit modo che lo spazio orizzontale può essere utilizzata in modo ottimale dal GridView. secondo le dimensioni dello schermo disponibile. Ho impostato il stretchMode su spacingWidthUniform in modo che le colonne siano posizionate alla stessa distanza da tutti i lati.

Desidero impostare verticalSpacing uguale a horizontalSpacing. Non posso farlo in xml qui perché a runtime lo horizontalSpacing dipenderà dallo spazio disponibile sullo schermo. Inoltre, quando l'orientamento del dispositivo viene modificato, lo horizontalSpacing cambierà.

Le mie domande sono:

  1. Come posso fare in modo che verticalSpacing sarà sempre pari al horizontalSpacing?

  2. Come può rendere GridView l'inizio della formattazione della prima colonna dall'inizio più il riempimento e la fine dell'ultima colonna di layout fino alla fine del GridView meno riempimento?

EDIT 1

Ho cercato @simas soluzione di utilizzare la visualizzazione griglia personalizzata menzionato. Per questo,

  1. Ho copiato questa classe per la mia directory di origine.

  2. Inclusa questa vista griglia in layout xml come mostrato di seguito.

<com.aviras.ashish.popularmoviesapp.widgets.CustomGridView 
    android:id="@+id/movies_gridview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:columnWidth="@dimen/grid_item_width" 
    android:drawSelectorOnTop="true" 
    android:gravity="center_horizontal" 
    android:numColumns="auto_fit" 
    android:stretchMode="spacingWidthUniform" 
    tools:listitem="@layout/grid_item_movie_poster" /> 
  1. Impostare l'adattatore a questo GridView come illustrato di seguito

    
    CustomGridView moviesGridView = (CustomGridView) rootView.findViewById(R.id.movies_gridview); 
    moviesGridView.setAdapter(new MoviesAdapter(rootView.getContext().getApplicationContext(), mMovies)); 
    

Esso mostra ancora la diversa spaziatura le colonne e le righe come mostrato di seguito. enter image description here

EDIT 2

@simas nella seconda domanda di 'inizio layouting' intendo che il GridView dovrebbe iniziare a tracciare la prima colonna all'inizio della GridView ed ultima colonna della GridView dovrebbe terminare alla fine dello GridView. Inoltre, le colonne e le righe dovrebbero avere la stessa spaziatura. Fatemi sapere se questo chiarisce ulteriormente la mia domanda.

risposta

0

È possibile creare una classe GridView personalizzato e modificare la funzionalità di setHorizontalSpacing e setVerticalSpacing come questo:

public class CustomGridView extends GridView { 

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

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

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

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public CustomGridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    @Override 
    public void setHorizontalSpacing(int horizontalSpacing) { 
     super.setHorizontalSpacing(horizontalSpacing); 
     // Call parent class to set the vertical spacing to be equal to the horizontal spacing 
     super.setVerticalSpacing(horizontalSpacing); 
    } 

    @Override 
    public void setVerticalSpacing(int verticalSpacing) { 
     // Prevent the derived class from modifying the vertical spacing 
     /*super.setVerticalSpacing(verticalSpacing);*/ 
    } 

} 

quindi utilizzare la classe personalizzata in XML come questo:

quanto riguarda la tua seconda domanda: non riuscivo davvero a capire cosa intendevi per "iniziare a strutturare".

Un esempio di immagine del risultato desiderato sarebbe di grande aiuto.

+0

Grazie per questa risposta. Proveremo questo e aggiorneremo qui. –

+0

per favore vedi la mia domanda modificata. –

0

è possibile utilizzare la visualizzazione di testo di custome gridview con lo spazio come desiderato e anche impostarlo orizzontalmente o verticalmente facilmente.

+0

Quale altezza e larghezza devo impostare su TextView in modo che sia horizontalSpacing e verticalSpacing in GridView siano uguali? –

0
<GridView 
      android:id="@+id/gridView" 
      android:layout_width="fill_parent" 
      android:layout_height="350dp" 
      android:layout_marginLeft="20dp" 
      android:layout_marginRight="20dp" 
      android:layout_marginTop="10dp" 
      android:clickable="true" 
      android:columnWidth="80dp" 
      android:drawSelectorOnTop="true" 
      android:focusable="true" 
      android:gravity="center" 
      android:numColumns="auto_fit" 
      android:smoothScrollbar="true" 
      android:splitMotionEvents="true" 
      android:stretchMode="columnWidth" 
      android:verticalSpacing="5dp" /> 




and textview that is : 

<TextView 
     android:id="@+id/text" 
     android:layout_width="match_parent" 
     android:layout_height="30dp" 
     android:layout_gravity="bottom" 
     android:background="#55d3d3d3" 
     android:gravity="center_vertical|center_horizontal" 
     android:paddingLeft="10dp" 
     android:paddingRight="10dp" 
     android:text="asdfasdadasds" 
     android:textColor="#77FFFFFF" /> 
+0

Questo non ha funzionato per me. Il mio problema è mantenere orizzontaleSpacing == verticalSpacing. La soluzione che hai aggiunto aggiunge la spaziatura verticale che può anche essere aggiunta con l'attributo verticalSpacing. Il problema che desidero risolvere è soddisfare la condizione horizontalSpacing == verticalSpacing in ogni caso su tutte le dimensioni dello schermo. \ –

Problemi correlati