2014-02-12 2 views
1

У меня проблема с моим GridView. Я использую часть проекта Bitmapfun, и я не хочу иметь преимущество сверху.Margin/padding top on GridView

Смотрите этот захват: enter image description here

У меня есть большая черная область (где я поставил 3 вопросительных знаков) между блесной и первыми фотографиями.

Если я прокручиваю вниз, я получаю хороший рендеринг: фото слайда под блесной: enter image description here

Если я вернусь к началу, я снова это большая черную область только перед первой фотографией. Кто-нибудь может мне помочь?

Вот мой GridView (image_grid_fragment.xml):

<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridView" 
    style="@style/PhotoGridLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:columnWidth="@dimen/image_thumbnail_size" 
    android:horizontalSpacing="@dimen/image_thumbnail_spacing" 
    android:numColumns="auto_fit" 
    android:stretchMode="columnWidth" 
    android:verticalSpacing="@dimen/image_thumbnail_spacing" > 

</GridView> 

В GridView входит в этот основной раскладке:

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

    <TextView 
     android:id="@+id/TextView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="17dp" 
     android:layout_marginLeft="16dp" 
     android:text="Album : " 
     android:textAppearance="?android:attr/textAppearanceSmallPopupMenu" 
     android:textSize="18dp" /> 

    <Spinner 
     android:id="@+id/spinner_album" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@+id/TextView1" 
     android:layout_marginTop="12dp" 
     android:inputType="text" 
     android:textSize="18dp" /> 

    <include layout="@layout/image_grid_fragment" /> 

</RelativeLayout> 

значения/styles.xml:

<style name="PhotoGridLayout"> 
    <item name="android:drawSelectorOnTop">false</item> 
    <item name="android:listSelector">@drawable/photogrid_list_selector</item> 
</style> 

значения-v11/styles.xml:

<style name="PhotoGridLayout"> 
    <item name="android:drawSelectorOnTop">true</item> 
</style> 

ImageGridActivity.java:

public class ImageGridActivity extends FragmentActivity { 
    private static final String TAG = "ImageGridFragment"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if (getSupportFragmentManager().findFragmentByTag(TAG) == null) { 
      final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.add(android.R.id.content, new ImageGridFragment(), TAG); 
      ft.commit(); 
     } 
    } 
} 

С компоновочных границ активированными в вариантах развития, у меня есть этот результат:

enter image description here

+0

Можете ли вы разместить xml для 'style/PhotoGridLayout', а также –

+0

Tim> конечно, я отредактировал мое сообщение. Благодаря ! – Jerry

+0

Ничего странного там. Проблема может быть в том, что выглядит как Spinner, над фактическим GridView. У вас есть код/​​xml для этого? –

ответ

0

Спасибо Roger Alien !! Он поставил меня на правильный путь!

Проблема была на GridView адаптера:

Частичный исходный код ImageGridFragment.java:

/** 
* The main adapter that backs the GridView. This is fairly standard except the number of 
* columns in the GridView is used to create a fake top row of empty views as we use a 
* transparent ActionBar and don't want the real top row of images to start off covered by it. 
*/ 
private class ImageAdapter extends BaseAdapter { 

    private final Context mContext; 
    private int mItemHeight = 0; 
    private int mNumColumns = 0; 
    private int mActionBarHeight = 0; 
    private GridView.LayoutParams mImageViewLayoutParams; 

    public ImageAdapter(Context context) { 
     super(); 
     mContext = context; 
     mImageViewLayoutParams = new GridView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
     // Calculate ActionBar height 
     TypedValue tv = new TypedValue(); 
     if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { 
      mActionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics()); 
     } 
    } 

    @Override 
    public int getCount() { 
     // If columns have yet to be determined, return no items 
     if (getNumColumns() == 0) { 
      return 0; 
     } 

     // Size + number of columns for top empty row 
     return Images.imageThumbUrls.length + mNumColumns; 
    } 

    @Override 
    public Object getItem(int position) { 
     return position < mNumColumns ? 
       null : Images.imageThumbUrls[position - mNumColumns]; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position < mNumColumns ? 0 : position - mNumColumns; 
    } 

    @Override 
    public int getViewTypeCount() { 
     // Two types of views, the normal ImageView and the top row of empty views 
     return 2; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return (position < mNumColumns) ? 1 : 0; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup container) { 
     // First check if this is the top row 
     if (position < mNumColumns) { 
      if (convertView == null) { 
       convertView = new View(mContext); 
      } 
      // Set empty view with height of ActionBar 
      convertView.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, mActionBarHeight)); 
      // 
      // THE PROBLEM IS HERE !! 
      // 

      return convertView; 
     } 

     // Now handle the main ImageView thumbnails 
     ImageView imageView; 
     if (convertView == null) { // if it's not recycled, instantiate and initialize 
      imageView = new RecyclingImageView(mContext); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setLayoutParams(mImageViewLayoutParams); 
     } else { // Otherwise re-use the converted view 
      imageView = (ImageView) convertView; 
     } 

     // Check the height matches our calculated column width 
     if (imageView.getLayoutParams().height != mItemHeight) { 
      imageView.setLayoutParams(mImageViewLayoutParams); 
     } 

     // Finally load the image asynchronously into the ImageView, this also takes care of 
     // setting a placeholder image while the background thread runs 
     mImageFetcher.loadImage(Images.imageThumbUrls[position - mNumColumns], imageView, false); 
     return imageView; 
    } 

    /** 
    * Sets the item height. Useful for when we know the column width so the height can be set 
    * to match. 
    * 
    * @param height 
    */ 
    public void setItemHeight(int height) { 
     if (height == mItemHeight) { 
      return; 
     } 
     mItemHeight = height; 
     mImageViewLayoutParams = new GridView.LayoutParams(LayoutParams.MATCH_PARENT, mItemHeight); 
     mImageFetcher.setImageSize(height); 
     notifyDataSetChanged(); 
    } 

    public void setNumColumns(int numColumns) { 
     mNumColumns = numColumns; 
    } 

    public int getNumColumns() { 
     return mNumColumns; 
    } 
} 

Смотри в середине, в общественной Посмотреть GetView(): Bitmapfun проект добавляет пустой вид с высота, равная высоте ActionBar (поскольку панель действий видна в исходном проекте Bitmapfun).

Если мы прокомментируем эту строку (или если мы сообщаем mActionBarHeight 0 в общедоступном ImageAdapter()), у нас нет этого пространства перед первым снимком.

Спасибо Тиму Кастельинсу тоже.!

1

Что такое содержание @layout/image_grid_fragment?

Что делать, если вы пытаетесь изменить

<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridView" 
    style="@style/PhotoGridLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    ... 

в

<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/gridView" 
    style="@style/PhotoGridLayout" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    ... 

Запустите приложение на андроид 4.2 и в настройках системы, Параметры разработчика -> показать макет границ (место галочка). Вы увидите, является ли это дополнением или маркой некоторых представлений.

Также вы можете установить что-то неправильное в bindView (или getView) для адаптера gridView.

+0

^Это '@ layout/image_grid_fragment' –

+0

Спасибо за ваш ответ! Итак ... с «wrap_content» вместо «fill_parent», у меня такой же результат. Я добавил захват с включенными ограничениями: странно, результат странный! – Jerry

+0

Спасибо! вы поставили меня на правильный путь, я нашел проблему (ответ ниже). – Jerry