将偏移应用于GridLayout项目并在所有项目中保持相同的大小

时间:2017-04-25 13:08:35

标签: android android-recyclerview android-gridlayout gridlayoutmanager

我想在网格中的项目之间创建一个空格。这些物品都应具有相同的宽度/高度。

我尝试过的事情:

创建一个GridLayoutOffsetDecorator,将偏移应用于所有网格项:

class GridLayoutOffsetDecorator(var offset: Int) : RecyclerView.ItemDecoration() {

    override fun getItemOffsets(
            outRect: Rect,
            view: View,
            parent: RecyclerView,
            state: RecyclerView.State?) {

        super.getItemOffsets(outRect, view, parent, state)

        outRect.set(offset, offset, offset, offset)
    }
}

偏移量为8dp会在项目之间创建16dp空格。所以我们仍然需要在外边缘应用8dp填充:

<android.support.v7.widget.RecyclerView
        android:id="@+id/productList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false"
        android:padding="8dp" />

结果是:

enter image description here

问题:项目大小不相同:

enter image description here

当您看到蓝线时,您会注意到高度略有不同。仅在填充Recyclerview之后才会出现此差异。这个填充似乎稍微调整了一些项目的大小。你们有这方面的经验吗?知道如何解决这个问题吗?

通过从项目中删除图像,高度差消失。这是图像的设置方式:

<SquareImageView
    android:id="@+id/image"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scaleType="centerCrop"
    app:imageResource="@{product.image}" />

SquareImageView:

class SquareImageView : ImageView {

    constructor(context: Context) : super(context)
    constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
    constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)

    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec)
    }
}

因此问题可能是由图像本身引起的。

2 个答案:

答案 0 :(得分:2)

使用GridLayoutManager时遇到了同样的问题。通过在适配器中设置图像的宽度和高度来解决它。 这是我的解决方案,希望它有所帮助。

我是如何在我的布局中放置ImageView的。

<LinearLayout
     android:id="@+id/layoutImageProduct"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:gravity="center"
     tools:minHeight="100dp"
     tools:minWidth="150dp">

       <ImageView
           android:id="@+id/imageProduct"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:scaleType="fitCenter"
           android:src="@drawable/placeholder_product"/>
</LinearLayout>

然后在父级布局和LayoutParams

上应用ImageView
//Setting View width/height
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) holder.layoutImageProduct.getLayoutParams();
params.width = (int) ResourcesUtils.getColumnWidth(context);
params.height = ((int) (ResourcesUtils.getColumnWidth(context)));
holder.layoutImageProduct.setLayoutParams(params);

params = (LinearLayout.LayoutParams) holder.imageProduct.getLayoutParams();
params.width = (int) ResourcesUtils.getColumnWidth(context);
params.height = (int) ResourcesUtils.getColumnWidth(context);
holder.imageProduct.setLayoutParams(params);

这是getWidth方法。

public static float getColumnWidth(Context context) {
        if (GRID_COLUMN_WIDTH == -1) {
            int screenWidth = getDisplayMetrics(context).widthPixels;
            float horizontalPadding = getDimensInPixel(context, R.dimen.activity_horizontal_margin);
            // NUM OF COLUMN = 2
            GRID_COLUMN_WIDTH = screenWidth / 2 - horizontalPadding * 2;
        }

        return GRID_COLUMN_WIDTH;
    }

查看屏幕截图,其中一个带有占位符,另一个带有图像。 {{3}}

答案 1 :(得分:1)

你可以尝试使用固定的imageview高度。