2012-06-05 3 views
0

У меня есть следующий заданный GridView w/stretchMode, установленный в "columnWidth".Android GridView stretchMode с Async ImageView Загрузка

<GridView android:id="@+id/grid" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:columnWidth="160dp" 
    android:numColumns="auto_fit" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:stretchMode="columnWidth" 
    android:listSelector="@drawable/list_selector" 
/> 

Каждый элемент в GridView структурирован следующим образом.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="2dp" 
> 
    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
    > 
     <ImageView android:id="@+id/videoGridItemImage" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:adjustViewBounds="true" 
     /> 
     <TextView android:id="@+id/videoGridItemDuration" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"  
      android:layout_gravity="bottom"  
      android:background="#88000000" 
      android:textColor="#F1F1F1" 
      android:textAppearance="@android:style/TextAppearance.Small" 
      android:padding="2dp" 
     /> 
    </FrameLayout> 
    <TextView android:id="@+id/videoGridItemTitle" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="left" 
     android:textAppearance="@android:style/TextAppearance.Medium" 
     android:textColor="#F1F1F1" 
     android:maxLines="1" 
     android:background="#88000000" 
     android:paddingLeft="2dp" 
     android:paddingRight="2dp" 
    /> 
    <TextView android:id="@+id/videoGridItemSubtitle" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="left" 
     android:textStyle="italic" 
     android:textColor="#666" 
     android:textAppearance="@android:style/TextAppearance.Small" 
     android:maxLines="1" 
     android:background="#88000000" 
     android:paddingLeft="2dp" 
     android:paddingRight="2dp" 
    /> 
</LinearLayout> 

В адаптере GridView, я буду асинхронная загрузка и отображение изображений, передавая URL и ссылки в ImageView к выделенному классу. Класс загружает изображение в растровое изображение, а затем обновляет ImageView с помощью setImageBitmap(). Этот рабочий процесс функционирует должным образом; однако мои изображения не заполняют всю ширину ImageView. На левой/правой стороне имеется небольшое количество подушек. Я понимаю, что могу использовать scaleType = "fitXY", но это не идеально, поскольку оно искажает изображения. Установка атрибута src для ImageView в локальное изображение масштабируется просто с помощью stretchMode = "columnWidth". Я предполагаю, что ImageView масштабируется до исходной ширины столбца, а не растянутой/динамической ширины. Кто-нибудь имеет представление о том, почему это происходит и/или как исправить? Заранее спасибо за вашу помощь.

ответ

0

У вас есть два варианта:

  1. Установите layout_width вашего ImageView к wrap_content. ImageView будет изменять размер в зависимости от размера изображения, и ваш столбец будет соответствующим образом регулировать.

  2. Установите масштабное изображение вашего ImageView в centerCrop. Это попытается поместить изображение в изображение без его перекоса и просто отрежет все излишки, которые не подходят. Это не оставляет пробелов.

+0

1. Установка layout_width ImageView в wrap_content просто поместит все дополнения с правой стороны - как показано на половину слева и половину справа. ImageView по-прежнему не заполняет всю ширину столбца по желанию. – ajporterfield

+0

2. Установка scaleType ImageView в centerCrop устраняет проблему перекоса, вызванную fitXY; однако он обрезает изображение, которое также не является идеальным. – ajporterfield

+0

Я вполне уверен, что проблема связана с stretchMode = "columnWidth". Если я использую любое другое значение для stetchMode (включая «none»), изображения отображаются как ожидалось - без обрезки/перекоса и заполнения всей ширины столбца. – ajporterfield

0

У меня была та же проблема. Моим решением было переопределить ImageView (в моем случае) FrameLayout, чтобы установить высоту перед загрузкой изображения. Я хотел квадратные плитки насильственными в моей GridView, и осуществляется следующим образом:

public class SquareFrameLayout extends FrameLayout { 

    public SquareFrameLayout(Context context) { 
    super(context); 
    } 
    public SquareFrameLayout(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 
    public SquareFrameLayout(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, widthMeasureSpec); 
    } 
} 

Каждый элемент GridView это:

<com.my.client.ui.layout.SquareFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/discovery_tile" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <ImageView 
    android:id="@+id/my_image" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:scaleType="centerCrop" 
    android:cropToPadding="true" 
    android:contentDescription="@string/my_desc" /> 

</com.my.client.ui.layout.SquareFrameLayout> 

Тогда в GridView я использовал это:

<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:name="com.my.client.ui.MyFragment" 
    android:id="@+id/my_gridview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:numColumns="3" 
    android:verticalSpacing="0px" 
    android:horizontalSpacing="0px" 
    android:stretchMode="columnWidth" 
    android:gravity="fill" />