Карточка из нескольких столбцов, чтобы заполнить размер экрана ландшафта

У меня есть такая проблема: в моем портретном режиме я использовал карточку, чтобы содержать изображения и тексты в массиве, и они взяли два столбца, что меня устраивает. Но то же самое происходит и в ландшафтном телефоне Android, это создает пространство между изображением и после него. Как сделать столбцы в альбомной ориентации три (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>

person Joshua Jumbo    schedule 04.11.2015    source источник
comment
Итак, вы работаете с GridView/RecyclerView и устанавливаете для столбцов значение 2?   -  person M090009    schedule 04.11.2015
comment
да. из кода. У меня есть cadview внутри линейного макета. и в карточке у меня есть изображение и текст, которые я использовал для создания массива. Итак, моя проблема заключается в следующем: когда я запускаю приложение на своем телефоне в ландшафтном режиме, у меня все еще есть изображение и текст, занимающие два столбца, как при запуске в портретном режиме. Поэтому у меня больше места в ландшафтном режиме, и я хочу использовать пространство, по крайней мере, позволяя изображению и тексту под изображением проходить через три столбца.   -  person Joshua Jumbo    schedule 04.11.2015
comment
Итак, вы добавляете эти элементы в код. Не могли бы вы показать мне код, чтобы я мог лучше понять   -  person M090009    schedule 04.11.2015
comment
это уже показано. посмотри в моем первом посте.   -  person Joshua Jumbo    schedule 04.11.2015


Ответы (1)


Вот два решения ваших проблем:

  1. Является ли использовать TableLayout и его TableRow.
  2. Использовать RecyclerView и GridLayoutManager, что, на мой взгляд, является оптимальным способом.

И в обоих случаях вам придется обнаруживать изменение ориентации, чтобы изменить столбцы представления.

1. Способ 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>

This will give you a TableLayout with two CardViews in a row, and if you want more columns to be added in the same row you just have to add them to the same TableRow tag.

Таким образом, в вашем коде вы можете добавить свои стандартные 2 элемента в строку, а затем, когда вы обнаружите изменение ориентации, вы увеличите количество столбцов до 3 следующим образом:

    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++;
    }

Вы можете проверить другой пример для TableLayout здесь


2. RecyclerView с GridLayoutManager [рекомендуется]

Вам нужно будет сделать следующее:

  1. Добавьте эту зависимость в свой файл build.gradle compile 'com.android.support:recyclerview-v7:23.0.1'
  2. Добавьте RecyclerView в свой макет, как это <android.support.v7.widget.RecyclerView android:id="@+id/myGridRecyclerView" android:layout_width="match_parent" android:layout_height="match_parent"/>
  3. Сделайте RecyclerViewAdapter и создайте и привяжите свои взгляды
  4. Вы можете сделать это, чтобы изменить количество столбцов:

    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 принесет вам пользу в будущем, если вы захотите добавить больше представлений в свой макет, это просто и динамично.


В обоих случаях вам нужно будет проверить свою ориентацию, и вы можете определить ее в своем методе onCreate().

Надеюсь это поможет

person M090009    schedule 04.11.2015
comment
@Jhosuer, что с тобой случилось?? - person M090009; 05.11.2015
comment
Спасибо! @ M090009 M090009 Я пробовал, но ничего не вышло, поэтому я пытался реализовать weightsum и layout_weight, но ничего не вышло. Я до сих пор не решил это. - person Joshua Jumbo; 07.11.2015
comment
Извините @Jhosuer за задержку с ответом, но я был занят. пожалуйста, ознакомьтесь с ответом, теперь он совершенно другой - person M090009; 10.11.2015
comment
Эй, @Jhosuer, что ты в итоге сделал? - person M090009; 05.12.2015
comment
Я фактически изменил параметр с java. Эта строка моего кода... if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { // Количество столбцов. Здесь было изменение mmLayoutManager = new GridLayoutManager(this, 2); mmRecyclerView.setLayoutManager (mmLayoutManager); } - person Joshua Jumbo; 30.12.2015