web-dev-qa-db-de.com

Android: Fügen Sie einen Teiler zwischen Elementen in RecyclerView hinzu

Ich verwende RecyclerView mit abgerundeter Ecke, um die abgerundete Ecke zu machen, die ich unter XML verwendet habe:

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>

Getting (ohne Positionstrennzeichen):

enter image description here

Erforderlich (mit Positionstrennzeichen):

enter image description here

13
Sun

Ich habe diesen Weg gemacht:

onCreateView () of Fragment:

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>

Hoffe, das wird dir helfen.

5
Hiren Patel

sie sollten versuchen, Teiler hinzuzufügen 

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

RecyclerView hat keine mit dem Teiler zusammenhängenden Parameter, um den Teiler anzuzeigen. Stattdessen müssen Sie eine Klasse aus ItemDecoration erweitern und die Methode addItemDecoration () verwenden, um den Divider anzuzeigen.

Erstellen Sie eine Klasse mit dem Namen DividerItemDecoration.Java und fügen Sie den folgenden Code ein.

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

Öffnen Sie Activity.Java und setzen Sie die Elementdekoration mithilfe der addItemDecoration () - Methode, bevor Sie den Adapter einstellen.

recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));

// set the adapter
recyclerView.setAdapter(mAdapter);
3
Arpit Patel

RecyclerView funktioniert anders als ListViews. Sie müssen ItemDecorators für die Recycler-Ansicht hinzufügen. Wie die Dokumente sagen,

Mit ItemDecoration kann die Anwendung bestimmten Elementansichten aus dem Datensatz des Adapters einen speziellen Zeichnungs- und Layout-Versatz hinzufügen. Dies kann nützlich sein, wenn Sie Zeichnungsunterteilungen zwischen Elementen, Hervorhebungen, visuellen Gruppierungsgrenzen usw. erstellen.

Schauen Sie sich diesen Link an: https://developer.Android.com/reference/Android/support/v7/widget/RecyclerView.ItemDecoration.html

2
Riyaz Ahamed

Um Trennzeichen zu Ihrer Recyclingübersicht hinzuzufügen, müssen Sie decorator - https://Gist.github.com/alexfu/0f464fc3742f134ccd1e verwenden, nachdem Sie diese zu Ihrem Projekt hinzugefügt haben. Fügen Sie eine Zeile hinzu recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

1
Viktor Yakunin

Nun, ich habe dazu erst das Layout für meine Adapterzeile erstellt 

    <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>

Dann habe ich in meinem Adapter nach der ersten Zeile gesucht und die Sichtbarkeit von viewLine in unsichtbar geändert

@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);
        //... 
    }
}
1
Sushant

Versuchen Sie es mit: Eine sehr schöne Lösung von 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);
    }
}
0
NickF

Wenn Sie einen benutzerdefinierten Adapter verwenden, setzen Sie den Selektor im Hintergrund des Listenelements in Ihrem Layout

0
vs.thaakur

sie setzen list_selector sowohl für den Text- als auch für den Listenhintergrund. Verwenden Sie list_selector nur für listview. Wenn Sie auch einen Hover-Effekt auf textview haben möchten, erstellen Sie einen weiteren list_selector_textview, der die <corners Android:radius="10dp"-Eigenschaft nicht enthält.

0
Irfan Ali

Diese Codezeile hat für mich funktioniert:

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

Für vertikale Linie übergeben Sie das zweite Argument als DividerItemDecoration.VERTICAL.

0

Probieren Sie Folgendes aus Referenz Android: ListView mit abgerundeten Ecken

Als Erstes benötigen wir die Drawables für die Hintergründe der Listeneinträge: Für die Einträge in der Mitte der Liste benötigen wir keine abgerundeten Ecken. Erstellen Sie daher in Ihrem drawable-Ordner "list_entry_middle.xml" eine xml folgenden Inhalt:

<?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>

Erstellen Sie für die abgerundeten Ecken eine weitere XML-Datei "round_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>

Das Implementieren des unteren Teils ist ziemlich gleich, nur mit bottomLeftRadius und bottomRightRadius. (Erstellen Sie auch eine mit abgerundeten Ecken, wenn die Liste nur einen Eintrag enthält.) Um die Benutzerfreundlichkeit zu verbessern, geben Sie auch Drawables mit anderen Farben für die verschiedenen Zustände an, die der Listeneintrag in einer anderen XML - Datei enthalten kann Zeichnungsordner ("selector_rounded_corner_top.xml") wie folgt:

<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>

Nun machen Sie dasselbe für die anderen Hintergründe der Liste .. Jetzt müssen Sie nur noch die richtigen Hintergründe in unserem ListAdapter zuweisen:

@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
   }
0
SelvaMariappan

Versuche dies

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>

Ihre Listenansicht:

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

Ändern Sie Ihre ListView wie folgt. Fügen Sie list_bg als Hintergrund für die ListView hinzu. Geben Sie außerdem etwas Auffüllung für den oberen und unteren Bereich der ListView an. Andernfalls überlappen das erste und das letzte Element in der Liste die abgerundeten Ecken mit rechteckigen Ecken.

<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" />
0
Dominic D'Souza

Nur eine Zeile ...

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

Das ist alles

0
Ravi

Verwenden Sie dieses Zeichenbare XML für die Kurvenform-Listenansicht und legen Sie den Hintergrund für Ihre Listenansicht oder ein beliebiges Layout fest: 

<?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>
0
Surender Kumar

Das Problem ist, dass Sie den Hintergrund mit Ecken nicht nur auf die Listenansicht, sondern auch auf das Element einstellen. Sie sollten separate Hintergründe für das Element (mit Auswahl) und einen für die Listenansicht mit Ecken erstellen.

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>

Jetzt können Sie diese Zeichnung als Hintergrund für Ihre Listenansicht einrichten.

<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" />

Und für Listenansichtselemente können Sie die Auswahlfunktion verwenden, um eine Hover-Funktionalität zu erhalten: 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"/>

Dabei ist list_item_selected: 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>

Danach können Sie diesen Selektor auf das Element in Ihrer XML-Datei einstellen:

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

Ihre Listenansicht hat also immer denselben Hintergrund mit Ecken, und der Hintergrund von Listenelementen wird ohne Ecken sein und wird im gedrückten oder ausgewählten Zustand geändert.

0