多列cardview填充landsacpe屏幕大小

时间:2015-11-04 12:12:49

标签: android android-cardview

我有这个挑战:在我的肖像模式中,我使用了一个cardview来包含一个数组中的图像和文本,他们采用了两列,我很好。但是,同样的安排发生在景观安卓手机中,这会在图像之间和之后创建空间。如何在横向三(3)中制作列? 以下是纵向布局的代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:layout_columnSpan="2"
    android:layout_column="2">

    <android.support.v7.widget.CardView
        android:layout_width="165dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="0dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="9dp"
        android:clickable="true"
        android:foreground="?android:attr/selectableItemBackground"
        card_view:cardBackgroundColor="@color/bright_foreground_material_dark"
        card_view:cardCornerRadius="3dp"
        card_view:cardElevation="0.01dp">

        <RelativeLayout
            android:id="@+id/top_layout"
            android:layout_width="165dp"
            android:layout_height="160dp">

            <ImageView
                android:id="@+id/img_thumbnail"
                android:layout_width="wrap_content"
                android:layout_height="150dp"
                android:layout_above="@+id/tv_species"
                android:scaleType="fitXY" />

            <TextView
                android:id="@+id/tv_species"
                android:layout_width="fill_parent"
                android:layout_height="40dp"
                android:layout_alignParentBottom="true"
                android:layout_alignParentLeft="true"
                android:layout_alignParentStart="true"
                android:layout_gravity="bottom"
                android:background="@color/custom_two"
                android:gravity="center_vertical"
                android:paddingLeft="5dp"
                android:paddingRight="2dp"
                android:text="Test"
                android:textColor="#fff"
                android:textSize="20dp" />

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

1 个答案:

答案 0 :(得分:5)

以下是针对您的问题的两种解决方案:

  1. 是使用TableLayout及其TableRow
  2. 在我看来,使用RecyclerViewGridLayoutManager这是最佳方式。
  3. 在这两者中,您必须检测方向更改才能更改视图列。

    1.The TableLayout方式

    您确定要添加TableLayout作为顶视图,然后在TableRow中添加元素以使它们位于同一行;例如,

    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:card_view="http://schemas.android.com/apk/res-auto"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
      //One row with two columns
    <TableRow
        android:gravity="center">
      //Each view is a column
      <android.support.v7.widget.CardView .../>
      </android.support.v7.widget.CardView .../>
    </TableRow>
    
    //One row with three columns
    <TableRow
        android:gravity="center">
      //Each view is a column
      <android.support.v7.widget.CardView .../>
      </android.support.v7.widget.CardView .../>
      </android.support.v7.widget.CardView .../>
    </TableRow>
    

    这会在中为您提供两个 TableLayout的{​​{1}},并且如果您希望在同一行中添加更多列你必须将它们添加到相同的CardViews代码中。

    因此,在您的代码中,您可以每行添加标准的2个项目,然后当您检测到方向更改时,将列数增加到3个,如下所示:

    TableRow

    您可以查看 int numberOfColumns = 2; //Check your orientation either in your OnCreate or after it if(this.context.getResources().getConfiguration().orientation == this.context.getResources().getConfiguration() .ORIENTATION_LANDSCAPE) numberOfColumns = 3; //Lets say that items is an array of your items which is the Image and text int itemsAdded = 0; TableRow tableRow = null; for (ItemView itemView : items) { //if the number of items added is multiple of number of columns //it will add a new row view to the table row if(itemsAdded % numberOfColumns == 0){ tableRow = new TableRow(getApplicationContext) //Add your tableRow settings here //Layout params tableView.addView(tableRow); } tableRow.addView(itemView); itemsAdded++; } here

    的其他示例

    2.使用GridLayoutManager的RecyclerView [推荐]

    您必须执行以下操作:

    1. build.gradle 文件中添加此依赖项 TableLayout
    2. 在此布局中添加compile 'com.android.support:recyclerview-v7:23.0.1' RecyclerView
    3. 制作<android.support.v7.widget.RecyclerView android:id="@+id/myGridRecyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/>并创建并绑定您的观点
    4. 您可以执行此操作来更改列数:

      RecyclerViewAdapter
    5. 如果您选择遵循此路径,则可以按照this教程进行操作。如果您想为布局添加更多视图,使用int numberOfColumns = 2; //Check your orientation in your OnCreate if(this.context.getResources().getConfiguration().orientation == this.context.getResources().getConfiguration() .ORIENTATION_LANDSCAPE) numberOfColumns = 3; this.recyclerView.setLayoutManager(new GridLayoutManager (this.context, numberOfColumns, GridLayoutManager.VERTICAL, false)); 将来会对您有所帮助。

      在这两种情况下,您都需要检查方向,然后才能在RecyclerView方法中检测到它。

      希望这有帮助