我有这个挑战:在我的肖像模式中,我使用了一个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>
答案 0 :(得分:5)
以下是针对您的问题的两种解决方案:
TableLayout
及其TableRow
。RecyclerView
和GridLayoutManager
这是最佳方式。在这两者中,您必须检测方向更改才能更改视图列。
您确定要添加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
您必须执行以下操作:
TableLayout
compile 'com.android.support:recyclerview-v7:23.0.1'
RecyclerView
<android.support.v7.widget.RecyclerView
android:id="@+id/myGridRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
并创建并绑定您的观点您可以执行此操作来更改列数:
RecyclerViewAdapter
如果您选择遵循此路径,则可以按照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
方法中检测到它。
希望这有帮助