使用带有方形ImageView的CardView时,使RecyclerView包装其内容

时间:2015-12-21 15:35:33

标签: android android-recyclerview layout-manager android-cardview

我正在尝试实现以下结构(下图)。如您所见,其中有两个部分RecyclerViewCardView。这两个部分由两个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在大多数情况下都能正常工作,除了此问题中描述的情况。

问题在于不可预测SquareImageView。当LayoutManager试图衡量其孩子时,它什么也得不到。这意味着全屏显示RecyclerView(好像heightwidth设置为match_parent)。

所以问题是:如何使RecyclerView使用不可预测的SquareImageView正确包装其内容?

0 个答案:

没有答案