android - desplegable - menu recyclerview
¿Cómo se puede agregar una línea divisoria en un RecyclerView de Android? (18)
Estoy desarrollando una aplicación para Android donde estoy usando
RecyclerView
.
Necesito agregar un
divisor
en
RecyclerView
.
Traté de agregar
recyclerView.addItemDecoration(new
DividerItemDecoration(getActivity(),
DividerItemDecoration.VERTICAL_LIST));
a continuación está mi código xml -
<android.support.v7.widget.RecyclerView
android:id="@+id/drawerList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
/>
¡En la actualización de octubre de 2016, la biblioteca de soporte v25.0.0 ahora tiene una implementación predeterminada de divisores horizontales y verticales básicos disponibles!
https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html
recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
Aquí está el código para un divisor personalizado simple (divisor vertical / 1dp de altura / negro):
Supongamos que tiene una biblioteca de soporte:
compile "com.android.support:recyclerview-v7:25.1.1"
código java
DividerItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.my_custom_divider));
recyclerView.addItemDecoration(divider);
entonces la muestra del archivo 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>
Cree un archivo xml separado en la carpeta 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>
Conecte ese archivo xml (su_archivo) en la actividad principal , así:
DividerItemDecoration divider = new DividerItemDecoration(
recyclerView.getContext(),
DividerItemDecoration.VERTICAL
);
divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.your_file));
recyclerView.addItemDecoration(divider);
Creo que estás usando
Fragments
para tener
RecyclerView
Simplemente agregue estas líneas después de crear sus objetos
RecyclerView
y
LayoutManager
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(dividerItemDecoration);
¡Eso es!
Es compatible con las orientaciones HORIZONTAL y VERTICAL.
Entonces, esta podría no ser la forma correcta, pero acabo de agregar una vista a la vista de un solo elemento de RecyclerView (ya que no creo que haya una función incorporada) de esta manera:
<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" />
Esto significa que cada elemento tendrá una línea que lo llena en su parte inferior.
Lo hice aproximadamente 1dp de alto con un fondo
#111111
.
Esto también le da una especie de efecto "3D".
La forma correcta es definir
ItemDecoration
para
RecyclerView
siguiente manera
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>
Finalmente configúrelo así
recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
Editar
Como señaló @Alan Solitar
context.getResources().getDrawable(R.drawable.line_divider);
se deprecia en lugar de eso puedes usar
ContextCompat.getDrawable(context,R.drawable.line_divider);
Necesita agregar la siguiente línea ...
mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));
Para que la respuesta de NJ sea un poco más simple, puede hacer:
public class DividerColorItemDecoration extends DividerItemDecoration {
public DividerColorItemDecoration(Context context, int orientation) {
super(context, orientation);
setDrawable(ContextCompat.getDrawable(context, R.drawable.line_divider));
}
}
Por desgracia, Android solo complica las cosas pequeñas. La forma más fácil de lograr lo que desea, sin implementar DividerItemDecoration aquí:
Agregue el color de fondo al RecyclerView al color del divisor deseado:
<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"/>
Agregue el margen inferior (android: layout_marginBottom) a la raíz de diseño del elemento (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>
Esto debería dar espacio de 1dp entre los elementos y el color de fondo de RecyclerView (que es gris oscuro aparecería como divisor).
Prueba este código simple de una sola línea
recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),LinearLayoutManager.VERTICAL));
Puede crear un divisor simple reutilizable.
Crear divisor:
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);
}
}
}
Crear línea divisoria: 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/grey_300" />
</shape>
Agregue el divisor a su vista Recycler:
RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecorator(ContextCompat.getDrawable(context, R.drawable.divider));
recyclerView.addItemDecoration(dividerItemDecoration);
Para eliminar el divisor del último elemento:
Para evitar el dibujo del divisor para el último elemento, debe cambiar esta línea.
for (int i = 0; i < childCount; i++)
A
for (int i = 0; i < childCount-1; i++)
Su implementación final debería ser así:
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);
}
}
}
Espero eso ayude:)
Si desea tener divisores horizontales y verticales:
-
Definir elementos de dibujo divisores horizontales y verticales:
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>
-
Agregue este segmento de código a continuación:
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);
Simplemente agregue un margen de x cantidad en la parte inferior de un elemento en su
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);
Simplemente agregue una Vista al final de su adaptador de artículo:
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="#FFFFFF"/>
ACTUALIZAR:
Para mejores resultados, convierta
1px
a
1dp
:
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#FFFFFF"/>
Todas estas respuestas me acercaron, pero a cada una le faltaba un detalle clave. Después de un poco de investigación, encontré que la ruta más fácil es una combinación de estos 3 pasos:
- Utilice la biblioteca de soporte https://developer.android.com/reference/android/support/v7/widget/DividerItemDecoration.html
- Crea un divisor con el color correcto
- Establezca este divisor en su tema como listDivider
Paso 1: mientras configura RecyclerView
recyclerView.addItemDecoration(
new DividerItemDecoration(context, layoutManager.getOrientation()));
Paso 2: en un archivo como 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>
Paso 3: en el tema de la aplicación
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Other theme items above -->
<item name="android:listDivider">@drawable/divider_gray</item>
</style>
EDITAR:
actualizado para omitir el último divisor:
Después de usar esto un poco, me di cuenta de que estaba dibujando un divisor después del último elemento, lo cual era molesto.
Así que modifiqué el
Paso 1 de la
siguiente manera para anular ese comportamiento predeterminado en DividerItemDecoration (por supuesto, hacer una clase separada es otra opción):
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);
}
}
}
);
Versión Kotlin:
recyclerview.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))
RecyclerView-FlexibleDivider
yqritc hace que este sea un trazador de líneas.
Primero agregue esto a su
build.gradle
:
compile ''com.yqritc:recyclerview-flexibledivider:1.4.0'' // requires jcenter()
Ahora puede configurar y agregar un divisor donde configure el adaptador de su 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());
recyclerview.addItemDecoration(new DividerItemDecoration(this, 0));
Donde
0
es horizontal y
1
es crítico