2012-05-23 17 views
5

Mam kalendarz oparty na GridView. Mam następujący układ XML z selektorem ustawionym na wartość null, czyli android:listSelector="@null" zgodnie z radą, którą otrzymałem z tej strony. Teraz otrzymuję pasek szerokości kilku pikseli po prawej stronie GridView. Czemu? Próbowałem wszystkiego, co mogłem, ale żeby pomóc. Oto mój układ XML:Niedoskonałość systemu Android GridView, jak usunąć dodatkową pustą przestrzeń w prawo

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" > 

      <GridView 
       android:id="@+id/calendar" 
       android:layout_width="fill_parent" 
       android:layout_height="match_parent" 
       android:horizontalSpacing="-1px" 
       android:numColumns="7" 
       android:stretchMode="columnWidth" 
       android:gravity="center" 
       android:verticalSpacing="-1px" 
       android:listSelector="@null" > 

      </GridView> 

     </LinearLayout> 

Co otrzymuję jest ten obraz:

enter image description here

+0

Może to jest problem przewijania? Spróbuj ustawić widoczność paska przewijania na false. – Demonick

+0

Czy próbowałeś zmienić poziome odstępy od -1 do 0? – matt5784

+1

@Demonick, wypróbowałem ten pasek przewijania i nie zadziałało. Zobacz odpowiedź 'dinesh sharma's' poniżej wydaje się mieć sens. – Lukuluba

Odpowiedz

6

To miejsce jest spowodowane niedoskonałym obliczeniem dla każdego wiersza siatki. Na przykład szerokość urządzenia to 320 pikseli i masz 7 wierszy, spróbuj wykonać dowolne obliczenia o wartości 320 pikseli. Jeśli szerokość każdej komórki wynosi 45,71428571428571 px, tylko wtedy można ją zmniejszyć.

Inną opcją

zastosować android: gravity = „center” nieruchomości w was siatki tak, że przestrzenie zostaną równo podzielone od lewej do prawej

+0

Yah, ty mają rację @ dinesh-sharma. W trybie poziomym odstęp prawie znika, co dowodzi, że problem jest związany z wymiarami ekranu. Nie mam jednak do roboty 'android: gravity =" center "'. Jednak wygląda to dość trywialnie. Dzięki! – Lukuluba

+0

Próbowałem rozwiązań 'android: gravity =" center "' i 'android: layout_gravity =" center "' i nie działały. Mam rozwiązanie kompromisowe polegające na określeniu szerokości kolumn w kodzie tak, aby ich łączona szerokość była większa niż szerokość ekranu devince'a. Zmusza to kolumny do wypełnienia ekranu, ale ostatnia kolumna jest nieznacznie obcięta - niezbyt dobra, jeśli masz ramkę, ponieważ znika z niej granica. Parametr with jest określony następująco: [link] http://bytecapsule.blogspot.com/2011/08/android-empty-space-to-right-of.html (ByteCapsule) – Lukuluba

0

Spróbuj użyć

android:layout_margin="0dp" 
android:padding="0dp" 

również może mieć to miejsca przeznaczonego na pasku przewijania.
A dlaczego masz odstępy pionowe i poziome z wartościami ujemnymi?

0

miałem ten sam problem, choć w moim przypadku nie miał kontroli nad instancją GridView, więc nie mogłem odczytać szerokości kolumny. Mimo to mogłem podklasować jego kontener.
To nie jest zbyt ortodoksyjne, ale można zastąpić metodę onMeasure i dodać kilka pikseli.
coś takiego:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    final int RIGHT_MARGIN_OVERSIZE_DIP = 6; 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    int width = this.getMeasuredWidth() 
    int overSize = (int)((getResources().getDisplayMetrics().density*RIGHT_MARGIN_OVERSIZE_DIP) + 0.5f); 
    widthMeasureSpec = MeasureSpec.makeMeasureSpec(width + overSize, MeasureSpec.getMode(widthMeasureSpec));   
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 
3

w moim przypadku miałem odstępy poziome jak 1DP

android:horizontalSpacing="1dp" 

tak, aby rozwiązać ten po prostu umieścić odpowiednią wyściółkę jak -1dp

android:paddingRight="-1dp" 

chociaż Spodziewałem się, że otrzymam miejsce po lewej stronie, ale zadziałało prawidłowo

+0

Miałem horizontalSpacing = "0dp" i to rozwiązanie i tak mi pomogło. Pusta przestrzeń zniknęła. –

+1

@Rempelos, jeśli dobrze pamiętam, liczba w paddingRight powinna wynosić -horizontalSpacing, więc jeśli masz horizontalSpacing o wartości 2dp, to paddingRight powinien wynosić -2 – Jimmar

+1

@JiMMaR, tak naprawdę masz rację. Myliłem ten przypadek z moim, gdzie miałem 'horizontalSpacing =" 0dp "' i nadal dodatkowa przestrzeń pojawiła się po prawej stronie, ale dodanie tylko 'paddingRight =" - 1dp "' naprawiło to. – Rempelos

0
grid.setColumnWidth(grid.getColumnWidth()+1); 

Otrzyma bieżącą wartość Kolumnowa Szerokość i doda do niej 1 piksel. Pamiętaj, aby użyć tego po onCreateView, ponieważ siatka musi być wcześniej zainicjalizowana.

Również twój widok siatki, należy użyć match_parent (wysokość i szerokość) .Powierzchnia obrazu/układ w kolumnie należy również match_parent.