【问题标题】:CardView and RecyclerView divider behaviourCardView 和 RecyclerView 分隔符行为
【发布时间】:2015-05-24 06:53:28
【问题描述】:

我正在尝试使用 RecyclerViewCardView 作为列表中的一个项目。
我想实现横向列表,用LayoutManager真的很简单。
所以我开始实施它。似乎一切正常,但不是我预期的结果是使用 CardView 作为列表项。

看起来不错,但我没有设置任何填充、分隔线和圆角。
这是我的卡片视图项目的 XML。

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_gravity="center"
        android:gravity="center"
       >
        <ImageView
            android:id="@+id/image_view"
            android:src="@drawable/androidsss"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignParentTop="true"
            android:layout_centerInParent="true"
            />
        <TextView
            android:id="@+id/info_text"
            android:layout_below="@+id/image_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:ellipsize="end"
            android:singleLine="true"
            android:textColor="@android:color/black"
            android:textSize="14sp" />
    </RelativeLayout>

</android.support.v7.widget.CardView>

布局底部还有一个小分隔线。
我没有指定任何内容。
这是我为 RecyclerView 设置代码

 mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(this);
    mLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
    mRecyclerView.setLayoutManager(mLayoutManager);
 //   mRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
    mAdapter = new CardViewDataAdapter(myDataset);
    mRecyclerView.setAdapter(mAdapter);

有趣的是,简单的项目,而不是卡片视图,一切都按预期工作。这是一个例子。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="150dp"
    android:layout_height="100dp"
    android:background="@android:color/white"
    >

    <ImageView
        android:id="@+id/item_image"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_centerInParent="true"
        />
    <TextView
        android:id="@+id/item_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/item_image"
        android:text="Hello World !!"
        android:layout_centerInParent="true"
        android:textColor="@android:color/black"
        />
</RelativeLayout>

问题出在哪里,是我的错还是bug?

【问题讨论】:

  • 也许它是 CardView 的功能?我的意思是这就是我们使用 cardViews 的原因——获取阴影等等。
  • 如果您不想要填充、圆角和阴影,那么就不要使用 CardView。一个普通的 FrameLayout 等就可以了。

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


【解决方案1】:

您可以看到的空间是compat paddings,它们仅在棒棒糖之前的设备上可见(或者如果您设置了card_view:cardUseCompatPadding="true",则在任何地方都可见)。您可以找到值 here(CardView 的文档)。

在 L 之前,CardView 为其内容添加填充并在该区域绘制阴影。这个填充量等于 maxCardElevation + (1 - cos45) *cornerRadius 在边和 maxCardElevation * 1.5 + (1 - cos45) *cornerRadius 在顶部和底部。

此外,据我所知,CardView 的角有一些默认半径(可能是 2dp)。

您可以尝试任何技巧来避免这些空间,或者(恕我直言,这更好)考虑是否应该使用自定义背景查看,例如简单的“平铺”。 Here你从谷歌那里得到了一些关于设计的信息。

【讨论】:

    【解决方案2】:

    这是CardView 的默认行为,但是您可以修改它的外观,例如通过在CardView 声明中添加属性来移除边框半径等。

    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="200dp"
        android:layout_height="200dp"
        card_view:cardCornerRadius="4dp"
        card_view:cardBackgroundColor='#ffffff'>
    

    欲了解更多信息,请访问此剪辑阴影 https://developer.android.com/training/material/shadows-clipping.html https://developer.android.com/reference/android/support/v7/widget/CardView.html

    【讨论】:

      【解决方案3】:

      试试这个布局

          <android.support.v7.widget.CardView
              android:layout_width="match_parent"
              android:layout_height="match_parent">
      
              <RelativeLayout
                  android:layout_width="100dp"
                  android:layout_height="100dp"
                  android:layout_gravity="center"
                  android:gravity="center">
      
                  <ImageView
                      android:id="@+id/image_view"
                      android:src="@drawable/androidsss"
                      android:layout_width="50dp"
                      android:layout_height="50dp"
                      android:layout_alignParentTop="true"
                      android:layout_centerInParent="true" />
      
                  <TextView
                      android:id="@+id/info_text"
                      android:layout_below="@+id/image_view"
                      android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:layout_centerInParent="true"
                      android:gravity="center"
                      android:ellipsize="end"
                      android:singleLine="true"
                      android:textColor="@android:color/black"
                      android:textSize="14sp" />
              </RelativeLayout>
      
          </android.support.v7.widget.CardView>
      </LinearLayout>
      

      【讨论】:

      • schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent">
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 2021-03-23
      • 1970-01-01
      相关资源
      最近更新 更多