我想在网格中的项目之间创建一个空格。这些物品都应具有相同的宽度/高度。
我尝试过的事情:
创建一个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" />
结果是:
问题:项目大小不相同:
当您看到蓝线时,您会注意到高度略有不同。仅在填充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)
}
}
因此问题可能是由图像本身引起的。
答案 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高度。