我正在尝试实现以下结构(下图)。如您所见,其中有两个部分RecyclerView
和CardView
。这两个部分由两个TextView
分隔Button
s。
每个部分应与屏幕宽度匹配(减去卡片之间的缩进)。每个CardView
都有正方形ImageView
。因此CardView
本身的高度取决于屏幕宽度:card_height = screen_width - indent_between_cards + space_for_card_text
。为了实现这种行为,我使用简单的SquareImageView
,如下所示:
public class SquaredImageView extends ImageView {
public SquaredImageView(Context context) {
super(context);
}
public SquaredImageView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SquaredImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMeasuredWidth();
setMeasuredDimension(width, width);
}
}
CardView布局如下所示:
<CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="0dp"
android:background="@color/snow"
android:clickable="true"
android:orientation="vertical">
<!-- Image -->
<com.test.views.SquaredImageView
android:id="@+id/card_image"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- Content -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="32dp"
android:orientation="horizontal">
<!-- Title -->
<TextView
android:id="@+id/card_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:singleLine="true"
android:textColor="@color/stone_dark"
android:textSize="14sp" />
<!-- Button -->
<ImageView
android:id="@+id/card_menu"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:clickable="true"
android:scaleType="center"
android:src="@drawable/ic_menu" />
</LinearLayout>
</CardView>
这意味着RecyclerView
的适配器事先不知道CardView
的尺寸。
您可能知道,RecyclerView
没有可以衡量其子视图的系统,无法正确包装其内容。
但不可预测的SquareImageView
+全屏RecyclerView
在大多数情况下都能正常工作,除了此问题中描述的情况。
LayoutManager
或WrappableLayoutManager
@se-solovyev
来解决问题。 问题在于不可预测SquareImageView
。当LayoutManager
试图衡量其孩子时,它什么也得不到。这意味着全屏显示RecyclerView
(好像height
和width
设置为match_parent
)。
所以问题是:如何使RecyclerView
使用不可预测的SquareImageView
正确包装其内容?