如何在列表视图中创建Google +卡UI?

Hic*_*ick 27 android android-listview android-cards

我想创建一个listView of cards,但在阅读了goolge-plus-layout的博客文章后,我的卡片是一个可行的解决方案,可以列出任何内容.动画部分似乎太占用内存,无法同时加载超过40个元素的列表视图.

有没有更好的方法来实现listView中的卡片UI?

Boo*_*ger 36

您可以创建自定义drawable,并将其应用于每个listview元素.

我在我的UI中使用这个卡片.我不认为这种方法存在重大的性能问题.

drawable代码(在drawable\big_card.xml中)如下所示:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <shape android:shape="rectangle" >
            <solid android:color="@color/second_grey" />
        </shape>
    </item>
    <item
        android:bottom="10dp"
        android:left="10dp"
        android:right="10dp"
        android:top="10dp">
        <shape android:shape="rectangle" >
            <corners android:radius="3dp" />

            <solid android:color="@color/card_shadow" />
        </shape>
    </item>
    <item
        android:bottom="12dp"
        android:left="10dp"
        android:right="10dp"
        android:top="10dp">
        <shape android:shape="rectangle" >
            <corners android:radius="3dp" />

            <solid android:color="@color/card_white" />
        </shape>
    </item>


</layer-list>
Run Code Online (Sandbox Code Playgroud)

我将背景应用于我的listview元素,如下所示:

<ListView
    android:id="@+id/apps_fragment_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:listSelector="@drawable/big_card" />
Run Code Online (Sandbox Code Playgroud)

如果您想将此作为背景添加到任何视图(不仅仅是列表),您只需将自定义可绘制视图的背景元素:

<TextView
        android:id="@+id/any_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/big_card" />
Run Code Online (Sandbox Code Playgroud)

  • 我用<color name ="second_grey">#ff999999 </ color> <color name ="card_white"> #fffffff </ color> <color name ="card_shadow">#8c666666 </ color>(注意透明度颜色) (6认同)
  • 我真的很好奇你使用的颜色. (2认同)
  • 谢谢.这看起来很不错.我在我的应用程序中使用了你的布局,然后我将second_grey更改为#ffeeeeee,它更轻(更多googley,imho) - 并将其移动到我的视图背景中,因此更少透支.我希望我能弄清楚如何在没有透支的情况下获得阴影.. Google+以某种方式做到了...... (2认同)

and*_*per 7

编辑:谷歌提供了一个很好的类叫做CardView.我没有检查它,但看起来很有希望.

这是以前的方式,也可以正常工作(这是我在编辑之前写的):

有一个很好的教程在这里和它的一个很好的样本在这里.

简而言之,这些是您可以创建的文件:

listView定义:

android:divider="@null"
android:dividerHeight="10dp"
android:listSelector="@android:color/transparent" 
android:cacheColorHint="@android:color/transparent"
android:headerDividersEnabled="true"
android:footerDividersEnabled="true"
Run Code Online (Sandbox Code Playgroud)

这个:

m_list.addHeaderView(new View(this));
m_list.addFooterView(new View(this));
Run Code Online (Sandbox Code Playgroud)

RES /抽拉/ selector_card_background.xml

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item
      android:state_pressed="true"
      android:drawable="@drawable/layer_card_background_selected" />

   <item android:drawable="@drawable/layer_card_background" />
</selector>
Run Code Online (Sandbox Code Playgroud)

listView项目:

RES /布局/ list_item_card.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:paddingLeft="15dp"
   android:paddingRight="15dp"
   android:descendantFocusability="beforeDescendants">

   <LinearLayout
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:paddingLeft="15dp"
      android:paddingTop="15dp"
      android:paddingBottom="15dp"
      android:paddingRight="15dp"
      android:background="@drawable/selector_card_background"
      android:descendantFocusability="afterDescendants">

      <TextView
         android:id="@+id/text1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>

      <TextView
         android:id="@+id/text2"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>

      <TextView
         android:id="@+id/text3"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
   </LinearLayout>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

RES /抽拉/ layer_card_background_selected.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#CABBBBBB"/>
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item
        android:left="0dp"
        android:right="0dp"
        android:top="0dp"
        android:bottom="2dp">
        <shape android:shape="rectangle">
            <solid android:color="#CCCCCC"/>
            <corners android:radius="2dp" />
        </shape>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)

RES /抽拉/ layer_card_background.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#CABBBBBB"/>
            <corners android:radius="2dp" />
        </shape>
    </item>

    <item
        android:left="0dp"
        android:right="0dp"
        android:top="0dp"
        android:bottom="2dp">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white"/>
            <corners android:radius="2dp" />
        </shape>
    </item>
</layer-list>
Run Code Online (Sandbox Code Playgroud)