Как можно добавить разделительную линию в Android RecyclerView?
Я разрабатываю приложение для Android, где я использую RecyclerView
. Мне нужно добавить divider в RecyclerView
.
Я попытался добавить -
recyclerView.addItemDecoration(new
DividerItemDecoration(getActivity(),
DividerItemDecoration.VERTICAL_LIST));
ниже - мой xml-код -
<android.support.v7.widget.RecyclerView
android:id="@+id/drawerList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
/>
Ответы
Ответ 1
В обновлении за октябрь 2016 года библиотека поддержки v25.0.0 теперь имеет стандартную реализацию основных горизонтальных и вертикальных разделителей!
https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html
recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
Ответ 2
Правильный способ - определить ItemDecoration
для RecyclerView
следующим образом
SimpleDividerItemDecoration.java
public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {
private Drawable mDivider;
public SimpleDividerItemDecoration(Context context) {
mDivider = context.getResources().getDrawable(R.drawable.line_divider);
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int top = child.getBottom() + params.bottomMargin;
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
}
line_divider.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
android:width="1dp"
android:height="1dp" />
<solid android:color="@color/dark_gray" />
</shape>
Наконец, установите его так
recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
Изменить
Как указано @Alan Solitar
context.getResources().getDrawable(R.drawable.line_divider);
обесценивается вместо того, что вы можете использовать
ContextCompat.getDrawable(context,R.drawable.line_divider);
Ответ 3
Если вы хотите иметь как горизонтальные, так и вертикальные разделители:
-
Определение горизонтальных и вертикальных разделителей:
horizontal_divider.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<size android:height="1dip" />
<solid android:color="#22000000" />
</shape>
vertical_divider.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<size android:width="1dip" />
<solid android:color="#22000000" />
</shape>
-
Добавьте этот сегмент кода ниже:
DividerItemDecoration verticalDecoration = new DividerItemDecoration(recyclerview.getContext(),
DividerItemDecoration.HORIZONTAL);
Drawable verticalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.vertical_divider);
verticalDecoration.setDrawable(verticalDivider);
recyclerview.addItemDecoration(verticalDecoration);
DividerItemDecoration horizontalDecoration = new DividerItemDecoration(recyclerview.getContext(),
DividerItemDecoration.VERTICAL);
Drawable horizontalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.horizontal_divider);
horizontalDecoration.setDrawable(horizontalDivider);
recyclerview.addItemDecoration(horizontalDecoration);
Ответ 4
Просто добавьте View к концу вашего адаптера элемента:
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#FFFFFF"/>
ОБНОВИТЬ:
Для лучших результатов конвертируйте 1px
в 1dp
:
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#FFFFFF"/>
Ответ 5
Все эти ответы приблизили меня, но в каждом из них отсутствовала ключевая деталь. После небольшого исследования я обнаружил, что самым простым маршрутом является сочетание этих трех шагов:
- Используйте библиотеку поддержки DividerItemDecoration
- Создайте разделитель с правильным цветом
- Установите этот разделитель в своей теме как listDivider
Шаг 1: при настройке RecyclerView
recyclerView.addItemDecoration(
new DividerItemDecoration(context, layoutManager.getOrientation()));
Шаг 2: в файле, таком как res/drawable/divider_gray.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<size android:width="1px" android:height="1px" />
<solid android:color="@color/gray" />
</shape>
Шаг 3: в теме приложения
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Other theme items above -->
<item name="android:listDivider">@drawable/divider_gray</item>
</style>
ОБНОВЛЕНИЕ: Обновлено, чтобы пропустить последний разделитель:
Немного воспользовавшись этим, я понял, что после последнего элемента рисует разделитель, что раздражает. Поэтому я изменил Шаг 1 следующим образом, чтобы переопределить это поведение по умолчанию в DividerItemDecoration (конечно, создание отдельного класса - это еще один вариант):
recyclerView.addItemDecoration(
new DividerItemDecoration(context, layoutManager.getOrientation()) {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int position = parent.getChildAdapterPosition(view);
// hide the divider for the last child
if (position == parent.getAdapter().getItemCount() - 1) {
outRect.setEmpty();
} else {
super.getItemOffsets(outRect, view, parent, state);
}
}
}
);
Ответ 6
Вот код для простого пользовательского разделителя (вертикальный делитель /1dp высота/черный):
Предположим, у вас есть библиотека поддержки:
compile "com.android.support:recyclerview-v7:25.1.1"
java code
DividerItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.my_custom_divider));
recyclerView.addItemDecoration(divider);
затем пример файла custom_divider.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<size android:height="1dp" />
<solid android:color="@android:color/black" />
</shape>
Ответ 7
Создайте отдельный XML файл в папке res/drawable
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<size android:height="1dp" />
<solid android:color="@android:color/black" />
</shape>
Подключите этот xml файл (ваш_файл) к основному действию, например:
DividerItemDecoration divider = new DividerItemDecoration(
recyclerView.getContext(),
DividerItemDecoration.VERTICAL
);
divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.your_file));
recyclerView.addItemDecoration(divider);
Ответ 8
Я думаю, вы используете Fragments
для RecyclerView
Просто добавьте эти строки после создания объектов RecyclerView
и LayoutManager
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(dividerItemDecoration);
Вот оно!
Он поддерживает как HORIZONTAL, так и VERTICAL ориентации.
Ответ 9
Попробуйте этот простой однострочный код
recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),LinearLayoutManager.VERTICAL));
Ответ 10
Так что это может быть не правильно, но я просто добавил представление к представлению одного элемента RecyclerView (поскольку я не думаю, что есть встроенная функция), например так:
<View
android:layout_width="fill_parent"
android:layout_height="@dimen/activity_divider_line_margin"
android:layout_alignParentBottom="true"
android:background="@color/tasklist_menu_dividerline_grey" />
Это означает, что каждый элемент будет иметь линию, которая заполняет его в нижней части. Я сделал это около 1dp с фоном #111111
. Это также дает своего рода "3D" эффект.
Ответ 11
Вам нужно добавить следующую строку...
mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));
Ответ 12
Котлин Версия:
recyclerview.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))
Ответ 13
Вы можете создать простой многоразовый разделитель.
Создать разделитель:
public class DividerItemDecorator extends RecyclerView.ItemDecoration {
private Drawable mDivider;
public DividerItemDecorator(Drawable divider) {
mDivider = divider;
}
@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
int dividerLeft = parent.getPaddingLeft();
int dividerRight = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int dividerTop = child.getBottom() + params.bottomMargin;
int dividerBottom = dividerTop + mDivider.getIntrinsicHeight();
mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
mDivider.draw(canvas);
}
}
}
Создать разделительную линию: divr.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size
android:width="1dp"
android:height="1dp" />
<solid android:color="@color/grey_300" />
</shape>
Добавьте разделитель в свой Recyclerview:
RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecorator(ContextCompat.getDrawable(context, R.drawable.divider));
recyclerView.addItemDecoration(dividerItemDecoration);
Чтобы удалить разделитель для последнего элемента:
Чтобы предотвратить рисование разделителя для последнего элемента, вы должны изменить эту строку.
for (int i = 0; i < childCount; i++)
к
for (int i = 0; i < childCount-1; i++)
Ваша окончательная реализация должна быть такой:
public class DividerItemDecorator extends RecyclerView.ItemDecoration {
private Drawable mDivider;
public DividerItemDecorator(Drawable divider) {
mDivider = divider;
}
@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
int dividerLeft = parent.getPaddingLeft();
int dividerRight = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount - 1; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int dividerTop = child.getBottom() + params.bottomMargin;
int dividerBottom = dividerTop + mDivider.getIntrinsicHeight();
mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
mDivider.draw(canvas);
}
}
}
Надеюсь, поможет:)
Ответ 14
yqritc RecyclerView-FlexibleDivider делает это одним лайнером. Сначала добавьте это в свой build.gradle
:
compile 'com.yqritc:recyclerview-flexibledivider:1.4.0' // requires jcenter()
Теперь вы можете настроить и добавить divder, где вы устанавливаете адаптер recyclerView:
recyclerView.setAdapter(myAdapter);
recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this).color(Color.RED).sizeResId(R.dimen.divider).marginResId(R.dimen.leftmargin, R.dimen.rightmargin).build());
Ответ 15
Android просто делает слишком много сложностей, к сожалению. Самый простой способ добиться того, чего вы хотите, без реализации DividerItemDecoration здесь:
Добавить цвет фона в RecyclerView до нужного цвета разделителя:
<RecyclerView
android:id="@+id/rvList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@color/colorLightGray"
android:scrollbars="vertical"
tools:listitem="@layout/list_item"
android:background="@android:color/darker_gray"/>
Добавить нижний край (android: layout_marginBottom) в корень макета элемента (list_item.xml):
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="1dp">
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="John Doe" />
<TextView
android:id="@+id/tvDescription"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tvName"
android:text="Some description blah blah" />
</RelativeLayout>
Это должно дать 1dp пространство между элементами и цвет фона RecyclerView (который темно-серый будет отображаться как разделитель).
Ответ 16
Чтобы сделать N J немного проще, вы можете сделать:
public class DividerColorItemDecoration extends DividerItemDecoration {
public DividerColorItemDecoration(Context context, int orientation) {
super(context, orientation);
setDrawable(ContextCompat.getDrawable(context, R.drawable.line_divider));
}
}
Ответ 17
Просто добавьте поле x в нижней части элемента в вашем RecycleView Adapter
.
onCreateViewHolder
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0, 0, 0, 5);
itemView.setLayoutParams(layoutParams);
Ответ 18
recyclerview.addItemDecoration(new DividerItemDecoration(this, 0));
Где 0
- горизонтальный, а 1
- верный
Ответ 19
Способ работы с представлением "Разделитель", а также "Пространства разделителя" заключается в добавлении расширения RecyclerView.
1.
Добавьте новый файл расширения с именем View или RecyclerView:
RecyclerViewExtension.kt
и добавьте метод расширения setDivider
в файл RecyclerViewExtension.kt.
/*
* RecyclerViewExtension.kt
* */
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.RecyclerView
fun RecyclerView.setDivider(@DrawableRes drawableRes: Int) {
val divider = DividerItemDecoration(
this.context,
DividerItemDecoration.VERTICAL
)
val drawable = ContextCompat.getDrawable(
this.context,
drawableRes
)
drawable?.let {
divider.setDrawable(it)
addItemDecoration(divider)
}
}
2.
Создайте файл ресурсов Drawable внутри пакета drawable
, например recycler_view_divider.xml
:
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="10dp"
android:insetRight="10dp>
<shape>
<size android:height="0.5dp" />
<solid android:color="@android:color/black" />
</shape>
</inset>
где вы можете указать левый и правый поля margin в android:insetLeft
и android:insetRight
.
3.
В вашей Деятельности или Фрагменте, где инициализируется RecyclerView, вы можете установить настраиваемый чертеж, вызвав:
recyclerView.setDivider(R.drawable.recycler_view_divider)
4.
Приветствия 🍺