Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android: Añadir divisor entre los elementos de RecyclerView

Estoy usando RecyclerView con la esquina redondeada, para hacer la esquina redondeada que utilicé debajo de XML:

View_rounded.xml: –

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <solid android:color="#008f8471"/> <stroke android:width="2dp" android:color="#ffffff" /> <corners android:radius="10dp"/> </shape> 

Fragment_main.xml: –

 <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/view_rounded"/> 

Adapter_main.xml: –

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/textTitle" style="@style/AppTheme.ListTextView" /> </LinearLayout> 

Style.xml: –

 <style name="AppTheme.ListTextView" parent="android:Widget.Material.TextView"> <item name="android:gravity">left</item> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textAllCaps">false</item> <item name="android:padding">10dp</item> <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item> <item name="android:textColor">@color/tabsScrollColor</item> <item name="android:textStyle">bold</item> </style> 

Obtención (sin separador de elementos):

Introduzca aquí la descripción de la imagen

Requerido (con separador de elementos):

Introduzca aquí la descripción de la imagen

  • Android: cómo reproducir video mp4 desde la URL?
  • Variables en los recursos XML: pasa valores de padres a hijos
  • No se permite el atributo de manifiesto de Android aquí
  • No solicite problema Window.FEATURE_ACTION_BAR
  • Android Studio - Autocompletar de XML Editor no funciona con bibliotecas de soporte
  • Xml extraer elementos del analizador xml
  • SchemaFactory no admite W3C XML Schema en plataforma de nivel 8?
  • Android ¿Es posible definir un mapa en un archivo XML?
  • 16 Solutions collect form web for “Android: Añadir divisor entre los elementos de RecyclerView”

    He hecho de esta manera:

    OnCreateView () del fragmento:

     RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView); recyclerView.addItemDecoration(new SimpleDividerItemDecoration(getActivity())); 

    SimpleDividerItemDecoration.java :

     public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; public SimpleDividerItemDecoration(Context context) { mDivider = context.getResources().getDrawable(R.drawable.recycler_horizontal_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); } } } 

    Recycler_horizontal_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="#2EC590" /> </shape> 

    Espero que esto te ayudará.

    RecyclerView funciona diferente de ListViews. Debe agregar ItemDecorators para la vista de reciclador. Como dice el documento,

    Un ItemDecoration permite que la aplicación agregue un dibujo especial y un desplazamiento de diseño a las vistas de elementos específicos del conjunto de datos del adaptador. Esto puede ser útil para dibujar divisiones entre elementos , aspectos destacados, límites de agrupación visual y más.

    Echa un vistazo a este enlace: https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ItemDecoration.html

    RecyclerView no tiene ningún parámetro relacionado con el divisor para mostrar el divisor. En su lugar, debe extender una clase de ItemDecoration y utilizar el método addItemDecoration () para mostrar el divisor.

    Cree una clase llamada DividerItemDecoration.java y pegue el código a continuación.

    DividerItemDecoration.java

     public class DividerItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Context context, int orientation) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); setOrientation(orientation); } public void setOrientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } public void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawHorizontal(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } } } 

    Abra Activity.java y establezca la decoración del elemento utilizando el método addItemDecoration () antes de configurar el adaptador.

     recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL)); // set the adapter recyclerView.setAdapter(mAdapter); 

    Bueno lo que hice para lograr esto es, primero creado el diseño de mi adaptador de fila como

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <View android:id="@+id/lineView" android:layout_width="match_parent" android:layout_height="2px" android:background="@android:color/black"/> <TextView android:id="@+id/textTitle" style="@style/AppTheme.ListTextView" /> </LinearLayout> 

    Entonces en mi adaptador comprobé para la primera fila y cambié su viewLine visibilidad a invisible

     @Override public void onBindViewHolder(ChildInfoViewHolder holder, final int position) { if(position == 0){ holder.viewLine.setVisibility(View.INVISIBLE); } //... } public static class MyViewHolder extends RecyclerView.ViewHolder{ protected View viewLine; public ChildInfoViewHolder(View view) { super(view); viewLine = view.findViewById(R.id.viewLine); //... } } 

    Para agregar divisores a su recyclerview debes usar el decorador – https://gist.github.com/alexfu/0f464fc3742f134ccd1e después de agregarlo a tu proyecto agrega una línea recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

    Usted debe intentar agregar divisor

     mListview.addItemDecoration(new DividerItemDecoration(this.getActivity(), LinearLayout.VERTICAL)); 

    Establezca el selector en el fondo del elemento de lista en su diseño si está utilizando adaptador personalizado

    Intente esto: Una solución muy agradable de Michel-F. Portzert

     public class ClippedListView extends ListView { public ClippedListView(Context context) { super(context); } public ClippedListView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void dispatchDraw(Canvas canvas) { float radius = 10.0f; Path clipPath = new Path(); RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight()); clipPath.addRoundRect(rect, radius, radius, Path.Direction.CW); canvas.clipPath(clipPath); super.dispatchDraw(canvas); } } 

    Prueba esto desde la referencia Android: ListView con esquinas redondeadas

    En primer lugar, necesitamos los drawables para los fondos de las entradas Lists: Para las entradas en el centro de la lista, no necesitamos esquinas redondeadas, así que crea un xml en tu carpeta drawable "list_entry_middle.xml" con el siguiente contenido:

     <?xml version="1.0" encoding="UTF-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <stroke android:width="1px" android:color="#ffbbbbbb" /> </shape> </item> <item android:bottom="1dp" android:left="1dp" android:right="1dp"> <shape > <solid android:color="#ffffffff" /> </shape> </item> </layer-list> 

    Para las esquinas redondeadas, cree otro xml, "rounded_corner_top.xml":

     <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <stroke android:width="1dp" android:color="#ffbbbbbb" /> <corners android:topLeftRadius="20dp" android:topRightRadius="20dp" /> </shape> </item> <item android:top="1dp" android:left="1dp" android:right="1dp" android:bottom="1dp"> <shape > <solid android:color="#ffffffff" /> <corners android:topLeftRadius="20dp" android:topRightRadius="20dp" /> </shape> </item> </layer-list> 

    La implementación de la parte inferior es bastante la misma, sólo con bottomLeftRadius y bottomRightRadius. (Tal vez también crear uno con todas las esquinas redondeadas, si la lista sólo tiene una entrada) Para una mejor usabilidad, también proporcionan drawables con otros colores para los diferentes estados, que el elemento de lista puede tener y hacer referencia a ellos en otro xml en la carpeta drawable "Selector_rounded_corner_top.xml") como sigue:

     <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/rounded_corner_top_click" android:state_pressed="true" /> <item android:drawable="@drawable/rounded_corner_top_click" android:state_focused="true" /> <item android:drawable="@drawable/rounded_corner_top" /> </selector> 

    Ahora haga lo mismo con los otros fondos de la lista. Todo lo que queda ahora, es asignar los fondos adecuados en nuestro ListAdapter como sigue:

     @Override public View getView(int position, View convertView, ViewGroup parent) { //... //skipping the view reuse stuff if (position == 0 && entry_list.size() == 1) { view.setBackgroundResource(R.drawable.selector_rounded_corner); } else if (position == 0) { view.setBackgroundResource(R.drawable.selector_rounded_corner_top); } else if (position == entry_list.size() - 1) { view.setBackgroundResource(R.drawable.selector_rounded_corner_bottom); } else { view.setBackgroundResource(R.drawable.selector_middle); } //... //skipping the filling of the view } 

    Modificar su ListView como below.Add el list_bg como el fondo de su ListView También especificar algún relleno para la parte superior y la parte inferior de la listView de lo contrario el primero y el último elemento de la lista se superponen con las esquinas redondeadas que muestran las esquinas rectangulares.

     <ListView android:id="@+id/listView" android:layout_height="wrap_content" android:layout_width="match_parent" android:background="@drawable/list_bg" android:paddingTop="10dp" android:paddingBottom="10dp" android:fastScrollEnabled="true" android:choiceMode="singleChoice" /> 

    Utilice este xml dibujable para el listview de la forma de la curva y el fondo del sistema a su visión de la lista o cualquier disposición:

     <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="6dp" /> <padding android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp" /> </shape> 

    Prueba esto

    Custom_rounded_list.xml:

     <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <gradient android:startColor="#ff2521" android:endColor="#2f5511" android:angle="270"/> <padding android:bottom="5dp" android:left="5dp" android:right="5dp" android:top="5dp" /> <corners android:bottomRightRadius="7dp" android:bottomLeftRadius="7dp" android:topLeftRadius="7dp" android:topRightRadius="7dp" /> </shape> 

    Su lista:

     <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/mylst" android:background="@drawable/custom_rounded_list" /> 

    Está configurando list_selector tanto para el fondo textview como para el listview. Utilice list_selector sólo para listview y si desea tener un efecto hover en textview, cree otro list_selector_textview que no incluya la propiedad <corners android:radius="10dp" .

    El problema es que está configurando el fondo con esquinas no sólo con la vista de lista, sino también con el elemento. Debe crear fondos separados para el elemento (con selector) y uno para la vista de lista con esquinas.

    List_bg.xml

     <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#008f8471"/> <stroke android:width="1dip" android:color="#ffffff" /> <corners android:radius="10dp"/> <padding android:left="0dip" android:top="0dip" android:right="0dip" android:bottom="0dip" /> </shape> 

    Ahora puede configurar este dibujable como el fondo de su vista de lista.

     <ListView android:id="@+id/listView" android:layout_height="wrap_content" android:layout_width="match_parent" android:background="@drawable/list_bg.xml" android:fastScrollEnabled="true" android:choiceMode="singleChoice" /> 

    Y para el elemento de vista de lista puede utilizar el selector para tener la funcionalidad de rastreo : list_item_selector.xml

     <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/list_item_selected" android:state_pressed="true"/> <item android:drawable="@drawable/list_item_selected" android:state_pressed="false" android:state_selected="true"/> <item android:drawable="@android:color/transparent"/> 

    Donde list_item_selected es: list_item_selected.xml

     <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#4d8f8471"/> <stroke android:width="1dip" android:color="#ffffff" /> </shape> 

    Y después de que usted puede configurar este selector para el elemento en su xml:

     <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/list_item_selector" /> 

    Así que su vista de lista tendrá siempre el mismo fondo con las esquinas, y el fondo de los elementos de la vista de lista, será sin esquinas y se cambiará en estado presionado o seleccionado.

    Sólo una línea …

     recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), null)); 

    Eso es todo

    Esta línea de código funcionó para mí:

     recyclerView.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.HORIZONTAL)); 

    Para la línea vertical, pase segundo argumento como DividerItemDecoration.VERTICAL .

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.