Android GridView中适合屏幕的恒定列数

Android GridView中适合屏幕的恒定列数,android,gridview,Android,Gridview,我想在GridView中显示一些图像缩略图(图像为正方形),每行显示两个图像,图像适合屏幕宽度(除了填充和边距),但具有最大宽度和高度(例如1英寸) 我读过一些问题,但无法解决问题。你能帮帮我吗 GridView xml: <GridView android:id="@+id/gridview" android:layout_width="match_parent" android:layout_height="match_parent" android:h

我想在
GridView
中显示一些图像缩略图(图像为正方形),每行显示两个图像,图像适合屏幕宽度(除了填充和边距),但具有最大宽度和高度(例如1英寸)
我读过一些问题,但无法解决问题。你能帮帮我吗

GridView xml:

<GridView
    android:id="@+id/gridview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:horizontalSpacing="10dp"
    android:numColumns="2"
    android:scrollbarStyle="outsideOverlay"
    android:scrollbars="vertical"
    android:stretchMode="columnWidth"
    android:verticalScrollbarPosition="right"
    android:verticalSpacing="10dp"
    android:padding="10dp" />

GridView项目xml:

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/thumbnail"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scaleType="fitXY"
    android:maxWidth="72pt"
    android:maxHeight="72pt"
    />

我添加了两张图片来显示我想要的内容


第一张图片(4英寸手机)正是我想要的,但随着屏幕宽度的增长(平板电脑或横向),如图2所示,我想放大图像项目。(请注意,存在最大宽度大小,因此此模式下的结果与图1中所示的手机不同)

是否尝试将GridView项目布局中ImageView的布局宽度设置为与父项匹配?

是否尝试将GridView项目布局中ImageView的布局宽度设置为与父项匹配?

您需要扩展ImageView以创建高度始终与宽度匹配的ImageView。
然后使用此视图而不是stock imageview,并将布局宽度和高度设置为与父视图匹配。并删除maxWidth和maxHeight。

您需要扩展imageview以创建高度始终与宽度匹配的imageview。
然后使用此视图而不是stock imageview,并将布局宽度和高度设置为与父视图匹配。然后删除maxWidth和maxHeight。

这是我刚刚测试过的:


因为您在xml中添加了GridView,所以在设置适配器的那个一刻就绘制了它,所以调用了onMeasure。在这种情况下,您可以使用
gridView.getWidth()
获得gridView的宽度(实际值),并将其传递给适配器的实例。然后您可以使用它来设置项目的宽度和高度(在
getView()
方法中),当然您必须手动计算边距,但是如果在项目的布局xml中定义了填充,填充效果会非常好这是我刚刚测试过的:


因为您在xml中添加了GridView,所以在设置适配器的那个一刻就绘制了它,所以调用了onMeasure。在这种情况下,您可以使用
gridView.getWidth()
获得gridView的宽度(实际值),并将其传递给适配器的实例。然后您可以使用它来设置项目的宽度和高度(在
getView()
方法中),当然您必须手动计算边距,但是如果在项目的布局xml中定义了填充,则填充效果会非常好,您必须自己计算所需的水平间距

由于结果以像素为单位,并且您可能希望处理实际大小(如英寸或DPs),因此首先需要将约束转换为像素。例如,要将DPs转换为像素,请使用:

float px = someDpValue * context.getResources().getDisplayMetrics().density;
然后,可以使用获取gridView的大小,然后可以进行计算并相应地设置gridView及其适配器

您可能需要设置每列的水平间距和高度


请注意,如果网格内的ImageView将使用非方形图像,它们将保持纵横比,因此您也必须处理它。您可以使用“中心裁剪”作为缩放类型,或者只拉伸图像。

您必须自己计算所需的水平间距

由于结果以像素为单位,并且您可能希望处理实际大小(如英寸或DPs),因此首先需要将约束转换为像素。例如,要将DPs转换为像素,请使用:

float px = someDpValue * context.getResources().getDisplayMetrics().density;
然后,可以使用获取gridView的大小,然后可以进行计算并相应地设置gridView及其适配器

您可能需要设置每列的水平间距和高度


请注意,如果网格内的ImageView将使用非方形图像,它们将保持纵横比,因此您也必须处理它。您可以使用中心裁剪作为缩放类型,或只是拉伸图像。

您应该在主要问题下方的评论中提出此类问题。需要50信誉才能做到这一点,抱歉您应该在主要问题下方的评论中提出此类问题。需要50信誉才能做到这一点,抱歉,非常感谢。我改进了我的问题,因为我认为它不够清楚。假设我的GridView大小是以像素为单位的,那么我如何实现我在问题中描述的这两种状态?您是否也假设输入图像的分辨率(宽度、高度)有任何变化?对于测量单位,可以使用英寸(例如,使用“1.5英寸”)。另外,我不确定现在的问题是什么。您只需根据您决定的约束条件计算所需的尺寸。非常感谢。我改进了我的问题,因为我认为它不够清楚。假设我的GridView大小是以像素为单位的,那么我如何实现我在问题中描述的这两种状态?您是否也假设输入图像的分辨率(宽度、高度)有任何变化?对于测量单位,可以使用英寸(例如,使用“1.5英寸”)。另外,我不确定现在的问题是什么。您只需根据您决定的约束条件计算所需的大小。@aliezra是您的解决方案吗?@JohnR作为Android开发者说您必须自己计算视图和间距大小。@aliezra是您的解决方案吗?@JohnR作为Android开发者说您必须自己计算视图和间距大小。