Android GridView stretchMode with Async ImageView Loading

时间:2012-06-05 04:26:19

标签: android gridview imageview

我将以下GridView定义为w / stretchMode设置为“columnWidth”。

<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的适配器中,我通过将ImageView的url和引用传递给专用类来异步加载和显示图像。该类将图像下载到位图中,然后使用setImageBitmap()更新ImageView。此工作流程按预期运行;但是,我的图像没有填充ImageView的整个宽度。左/右侧有少量的填料。我意识到我可以使用scaleType =“fitXY”,但这并不理想,因为它会使图像偏斜。使用stretchMode =“columnWidth”将ImageView的src属性设置为局部图像可以很好地缩放。我的猜测是ImageView缩放到原始columnWidth而不是拉伸/动态宽度。有没有人知道为什么会发生这种情况和/或如何解决?在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

您有两种选择:

  1. 将ImageView的layout_width设置为wrap_content。 ImageView将根据图像的大小调整大小,您的列将相应调整。

  2. 将ImageView的scaleType设置为centerCrop。这将尝试将图像适合图像视图而不会使其偏斜,并且只会切掉任何不适合的多余部分。这将不留空格。

答案 1 :(得分: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" />