将图片适应网格视图显示

6

我正在尝试将图片适应到网格视图中。但我不明白我的网格视图从哪里获取了视图的高度。

网格视图的单元格比图片小。我想在单元格中完整显示图片,但我不想硬编码ImageView的大小。

我的代码

xml中的gridView

<GridView
    android:id="@+id/gridview_movie_list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_gravity="center"
    android:numColumns="auto_fit"
    android:columnWidth="185dp"
    android:stretchMode="columnWidth"/>

我正在膨胀的ImageView。

 <ImageView
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:scaleType="centerCrop"/>

我的适配器类中的getView方法

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
            mContext.LAYOUT_INFLATER_SERVICE);
    ImageView imageView;

    if (convertView == null) {
        imageView = (ImageView) inflater.inflate(R.layout.grid_view_item, null);
    } else {
        imageView = (ImageView) convertView;
    }

    Picasso.with(mContext).setLoggingEnabled(false);
    Picasso.with(mContext)
            .load(imageResource[position])
            .into(imageView);

    return imageView;
}

这是我得到的东西:

这是我得到的内容

这是我得到的内容

而这是所需的:

在此输入图像描述

4个回答

7
在我的图像视图XML中添加这行代码对我很有用。
android:adjustViewBounds="true"

现在我的输出与我想要的完全一样。感谢大家的帮助。

0

不,这段代码并没有帮助。它的作用是调整图像大小以适应这些单元格。而我想要的是图像能够填满单元格。 - Saran Sankaran
也许尝试使用 ScaleType.FIT_CENTER - Nevermore

0

尝试在ImageView上使用fitXy,它将尝试适应边缘而不降低像素

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="fitXY"/>

不,这段代码没有帮助。它所做的是重新调整图像大小以填充单元格。但是单元格的大小与我之前得到的输出相同。 - Saran Sankaran
我明白了,很抱歉之前回答错误。我认为你可以使用适配器将所有图像填充到GridView中。因此,您最终将拥有2个XML文件,一个是GridView,另一个是网格上的视图。所以你只需要为你的GridView创建一个适配器。我会再为你发布一篇答案。 - Andrew Indayang

0

这是你的GridView添加到gridview.xml中

<GridView
    android:id="@+id/clueGrid"
    android:layout_width="280dp"
    android:layout_height="match_parent"
    android:layout_below="@id/gameInstructions"
    android:layout_centerHorizontal="true"
    android:horizontalSpacing="20dp"
    android:verticalSpacing="20dp"
    android:paddingTop="10dp"
    android:numColumns="2"
    />

将此添加到另一个xml文件中 --> grid_view_image.xml

<com.XXXX.view.SquareRelativeLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:background="@drawable/grid_item_background"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

<ImageView
    android:layout_width="40dp"
    android:layout_height="40dp"
    android:src="@drawable/clue_found"
    android:layout_alignParentRight="true"
    android:layout_marginRight="10dp"
    android:layout_marginBottom="10dp"
    android:layout_alignParentBottom="true"
    android:id="@+id/itemView"/>

</com.XXXX.view.SquareRelativeLayout>

并且那个 XML 使用 SquareRelativeLayout,将其添加到 Java 中。

public class SquareRelativeLayout extends RelativeLayout {

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

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

现在你需要创建你的适配器

public class ItemGridAdapter extends BaseAdapter{

List<Item> itemList;

public ItemGridAdapter(List<Item> itemList){
    this.itemList = itemList;
}

@Override
public int getCount() {
    return itemList.size();
}

@Override
public Object getItem(int position) {
    return itemList.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null){
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        convertView = inflater.inflate(R.layout.grid_view_image, parent, false);
    }
    final ImageView itemView = (ImageView) convertView.findViewById(R.id.itemView);
    itemView.setImageDrawable("YOUR DRAWABLE");
    return convertView;
}
}

然后在使用gridview.xml的主类上

ItemGridAdapter itemGridAdapter = new ItemGridAdapter(itemList);
itemGrid.setAdapter(itemGridAdapter);

然后您可以在 ImageView 和布局上进行操作。希望这有所帮助!

我看到您在这里使用 Picasso,以下是我为适配器设置图像的答案:

   Target target = new Target() {
            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                itemView.setImageBitmap(bitmap);
            }

            @Override
            public void onBitmapFailed(Drawable errorDrawable) {
                // Meh
            }

            @Override
            public void onPrepareLoad(Drawable placeHolderDrawable) {
                // Meh
            }
        };

    Picasso.with(convertView.getContext())
                .load(imageUrl)
                .into(target);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接