Маржа между элементами просмотра recycler Android

Привет, я следую этому руководству

http://www.journaldev.com/10024/androidrecyclerview-and-cardview-example-tutorial

Теперь я столкнулся с странной проблемой, разница между каждым элементом карты в обзоре recycler слишком велика.

ВОПРОС

Как уменьшить маржу между каждым элементом карты, размещенным внутри вида ресайклера.

Введите описание изображения здесь

Я столкнулся с аналогичной проблемой, с RelativeLayout в качестве корневого элемента для каждой строки в recyclerview.

Чтобы решить эту проблему, найдите файл xml, который содержит каждую строку, и убедитесь, что высота корневого элемента – wrap_content NOT match_parent .

  1. Найдите атрибут card_view:cardUseCompatPadding="true" в card_layout.xml и удалите его. Запустите приложение, и вы обнаружите, что между каждым элементом карты нет поля.

  2. Добавьте атрибуты полей, которые вам нравятся. Пример:

     android:layout_marginTop="5dp" android:layout_marginBottom="5dp" 

Я создал класс для решения этой проблемы. Этот класс устанавливает разные поля для элементов внутри recyclerView: только первая строка будет иметь верхнее поле, и только первый столбец будет иметь левый край.

 public class RecyclerViewMargin extends RecyclerView.ItemDecoration { private final int columns; private int margin; /** * constructor * @param margin desirable margin size in px between the views in the recyclerView * @param columns number of columns of the RecyclerView */ public RecyclerViewMargin(@IntRange(from=0)int margin ,@IntRange(from=0) int columns ) { this.margin = margin; this.columns=columns; } /** * Set different margins for the items inside the recyclerView: no top margin for the first row * and no left margin for the first column. */ @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int position = parent.getChildLayoutPosition(view); //set right margin to all outRect.right = margin; //set bottom margin to all outRect.bottom = margin; //we only add top margin to the first row if (position <columns) { outRect.top = margin; } //add left margin only to the first column if(position%columns==0){ outRect.left = margin; } } 

}

Вы можете установить его в своем recyclerview таким образом

  RecyclerViewMargin decoration = new RecyclerViewMargin(itemMargin, numColumns); recyclerView.addItemDecoration(decoration); 

Вместо того, чтобы использовать XML для добавления поля между элементами в RecyclerView, лучше использовать RecyclerView.ItemDecoration, предоставляемые инфраструктурой Android.

Итак, я создаю библиотеку для решения этой проблемы.

https://github.com/TheKhaeng/recycler-view-margin-decoration

Введите описание изображения здесь

Попробуйте добавить RecyclerView.ItemDecoration

Чтобы узнать, как это сделать: как добавить разделители и пробелы между элементами в RecyclerView?

Изменение в представлении Recycler match_parent для wrap_content :

 <android.support.v7.widget.RecyclerView android:id="@+id/recycleView" android:layout_width="match_parent" android:layout_height="wrap_content" /> 

Также измените расположение элементов xml

Сделать родительский макет высотой match_parent для wrap_content

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

Если вы хотите сделать это в XML , jus set paddingTop и paddingLeft для вашего RecyclerView и равного количества layoutMarginBottom и layoutMarginRight для элемента, который вы надуваете в свой RecyclerView (или наоборот).