RecyclerViewのアイテム間に仕切りとスペースを追加する方法は?


938

これは、以前に行われている可能性がどのようにの一例でListView使用して、クラス分圧器dividerHeightパラメータを:

<ListView
    android:id="@+id/activity_home_list_view"
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:divider="@android:color/transparent"
    android:dividerHeight="8dp"/>

しかし、私はそのような可能性をRecyclerViewクラスで見ていません。

<android.support.v7.widget.RecyclerView
    android:id="@+id/activity_home_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical"/>

その場合、余白を定義したり、カスタムの分割ビューをリストアイテムのレイアウトに直接追加したりしても問題ありませんか、それとも私の目標を達成するためのより良い方法はありますか?



@EyesClearアイテム<TextView />に別のxmlを追加し、リストSame Activityで使用します。
Amitsharma

7
そこサポートlibにクラスがあるcom.homeretailgroup.argos.android.view.decorators.DividerItemDecorationと、そのようにそれを使用する:mRecyclerView.addItemDecoration(new DividerItemDecoration(activity, LinearLayoutManager.VERTICAL));
fada21

垂直方向のリストのリストアイテムに下マージンを追加できます。おそらくそれをディバイダーとして使用できますか?
-resw67

最も簡単な方法は、アダプターの行の最初の項目の周囲に上下のマージンを追加することです。android:layout_marginBottom = "4dp"。(親レイアウトにマージンを追加しても切り取られないことに注意してください。)
pstorli 2018年

回答:


1227

2016年10月の更新

Androidサポートライブラリのバージョン25.0.0で導入されたDividerItemDecorationクラス:

DividerItemDecorationはRecyclerView.ItemDecorationであり、のアイテム間の仕切りとして使用できますLinearLayoutManagerHORIZONTALVERTICAL向きの両方をサポートしています。

使用法:

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
    layoutManager.getOrientation());
recyclerView.addItemDecoration(dividerItemDecoration);

前の答え

一部の回答は、廃止されたメソッドを使用するか、完全なソリューションを提供しないかのいずれかであるので、短い最新のまとめを実行しようとしました。


とは異なりListViewRecyclerViewクラスにはディバイダー関連のパラメーターがありません。代わりに、拡張する必要がありItemDecorationRecyclerViewの内部クラス:

ItemDecorationアダプタのデータセットから特定のアイテムのビューへのオフセット特殊な描画とレイアウトを追加するアプリケーションを可能にします。これは、アイテム間のハイライト、ハイライト、視覚的なグループ化境界などを描画するのに役立ちます。

すべてがItemDecorations(中のアイテムビューの前に、それらが追加された順序で描画されているonDraw())とonDrawOver内の項目((後にCanvasRecyclerViewRecyclerView.State)

Vertical 間隔 ItemDecoration

拡張しItemDecoration、スペースheightをパラメーターとして取り、getItemOffsets()メソッドをオーバーライドするカスタムコンストラクターを追加します。

public class VerticalSpaceItemDecoration extends RecyclerView.ItemDecoration {

    private final int verticalSpaceHeight;

    public VerticalSpaceItemDecoration(int verticalSpaceHeight) {
        this.verticalSpaceHeight = verticalSpaceHeight;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
            RecyclerView.State state) {
        outRect.bottom = verticalSpaceHeight;
    }
}

最後のアイテムの下にスペースを挿入したくない場合は、次の条件を追加します。

if (parent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1) {
            outRect.bottom = verticalSpaceHeight;
}

注:とプロパティを変更してoutRect.top、目的の効果を得ることができます。outRect.leftoutRect.right

分周器 ItemDecoration

メソッドの拡張ItemDecorationとオーバーライドonDraw()

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

    private Drawable divider;

    /**
     * Default divider will be used
     */
    public DividerItemDecoration(Context context) {
        final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
        divider = styledAttributes.getDrawable(0);
        styledAttributes.recycle();
    }

    /**
     * Custom divider will be used
     */
    public DividerItemDecoration(Context context, int resId) {
        divider = ContextCompat.getDrawable(context, resId);
    }

    @Override
    public void onDraw(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 + divider.getIntrinsicHeight();

            divider.setBounds(left, top, right, bottom);
            divider.draw(c);
        }
    }
}

デフォルトのAndroidディバイダー属性を使用する最初のコンストラクター、または独自のドローアブルを使用する2番目のコンストラクター(例:drawable / 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="#ff992900" />
</shape>

注:仕切りをアイテムのに描画する場合は、onDrawOver()代わりにメソッドをオーバーライドしてください。

使用法

新しいクラスを使用するには、フラグメントのメソッドなどでadd VerticalSpaceItemDecorationまたはDividerSpaceItemDecorationtoを実行RecyclerViewしますonCreateView()

private static final int VERTICAL_ITEM_SPACE = 48;
private RecyclerView recyclerView;
private LinearLayoutManager linearLayoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_feed, container, false);

    recyclerView = (RecyclerView) rootView.findViewById(R.id.fragment_home_recycler_view);
    linearLayoutManager = new LinearLayoutManager(getActivity());
    recyclerView.setLayoutManager(linearLayoutManager);

    //add ItemDecoration
    recyclerView.addItemDecoration(new VerticalSpaceItemDecoration(VERTICAL_ITEM_SPACE));
    //or
    recyclerView.addItemDecoration(new DividerItemDecoration(getActivity()));
    //or
    recyclerView.addItemDecoration(
            new DividerItemDecoration(getActivity(), R.drawable.divider));

    recyclerView.setAdapter(...);

    return rootView;
}

アイテムの装飾プロセスを簡素化すると思われるLucas Rochaのライブラリもあります。まだ試していません。

その機能には次のものがあります。

  • 以下を含む在庫品装飾のコレクション:
  • アイテムの間隔水平/垂直の仕切り。
  • リストアイテム

3
@droppin_science間違っている場合は修正してください。ただし、でオブジェクトを作成しませんonDraw()。既存のインスタンスを参照するだけです。
EyesClear 2015

1
ドローアブルを作成する代わりにペイントを使用するのは良い考えでしょうか?それから私は、呼び出すことができますcanvas.drawLine(startX, startY, stopX, stopY, mPaint)ではonDrawOver?パフォーマンスの違いはありますか?
2015

1
単なる有益なコメント:後でリストにアイテムを追加する場合は、常に最後のアイテムにスペースを追加してください。そうしないと、アイテムを追加するときにスペースがなくなります。VerticalSpaceをありがとう!
津晴

24
上記のDividerItemDecorationは、アイテムが完全に不透明な場合は機能しません。ディバイダーはアイテムによって上書きされます。その場合は、getItemOffsets()もオーバーライドし、outRectにボトムオフセットを追加して、仕切りがアイテムの外側になるようにする必要があります。または、onDraw()の代わりにonDrawOver()をオーバーライドして、アイテムの後にディバイダーを描画することもできます。
jpop

115
単に分周器をrecyclerViewに追加するコードのページ全体が最良の答えです。恥ずかしい、グーグル。
Cautional7j 2016年

480

追加するだけ

recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),
                DividerItemDecoration.VERTICAL));

また、依存関係を追加する必要があるかもしれません
compile 'com.android.support:recyclerview-v7:27.1.0'

編集:

少しカスタマイズするには、カスタムドローアブルを追加できます。

DividerItemDecoration itemDecorator = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL);
itemDecorator.setDrawable(ContextCompat.getDrawable(getContext(), R.drawable.divider));

たとえば、カスタムドローアブルを自由に使用できます。

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="@color/colorPrimary"/>
    <size android:height="0.5dp"/>
</shape>

アクティビティは必要ありません。コンテキストは十分です
mac229 2018年

これは正解でなければなりません。Plz、getActivityを単なるコンテキストに変更します。
Jhon Fredy Trujillo Ortega

また、LayoutManagerから方向を取得することをお勧めします。
lsrom

ありがとうございました!また、あなたは使用することができConfiguration、垂直ディバイダのために:if (orientation == Configuration.ORIENTATION_LANDSCAPE) { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.HORIZONTAL)); } else { recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));}
AlexS

3
いい答えですが、最後の項目の後にも仕切りを追加します。
CoolMind

256

Alex FuによるGithub上のこの特定のファイルに注意を向けさせてもらえますか:https : //gist.github.com/alexfu/0f464fc3742f134ccd1e

これは、「サポートデモから直接引き出された」DividerItemDecoration.javaサンプルファイルです。(https://plus.google.com/103498612790395592106/posts/VVEB3m7NkSS

このファイルをプロジェクトにインポートした後、分割線をうまく取得して、アイテムの装飾としてリサイクラービューに追加することができました。

これは、Recyclerviewを含むフラグメントでのonCreateViewの外観です。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_recycler_view, container, false);

    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view);
    mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(getActivity());
    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());

    return rootView;
}

追加のスタイリングを実行できると確信していますが、それは出発点です。:)


「footerDividersEnabled」、「headerDividersEnabled」、「listSelector」、「fastScrollEnabled」、「smoothScrollbar」、「textFilterEnabled」をどのように追加して置き換えますか?
Android開発者

スタイリングを配置する方法に関する任意の入力?
nizam.sp 2014

このソリューションのスタイルを設定するには、テーマの "android:listDivider"属性を上書きする必要があります
Pavel Dudka

1
DividerはRecyclerViewでは機能しません。RecyclerView.itemDecorationを使用する必要があります。この回答を参照してください:stackoverflow.com/a/27664023/2311451
Cocorico

3
なぜディバイダーはアイテムの幅全体を拡大するのですか?仕様のように表示する方法google.com/design/spec/components/lists.html#lists-specs
チップ

156

ItemDecorationすべてのアイテム間の等間隔のシンプルな実装。

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
    private int space;

    public SpacesItemDecoration(int space) {
        this.space = space;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.left = space;
        outRect.right = space;
        outRect.bottom = space;

        // Add top margin only for the first item to avoid double space between items
        if(parent.getChildAdapterPosition(view) == 0) {
            outRect.top = space;
        }
    }
}

スペースを取得していますが、ディバイダーを取得するには
Pankaj Nimgade

26
getChildPositionは非推奨になり、getChildAdapterPosition代わりに使用できます。
EyesClear 2015

4
(私がしたように)への呼び出しを削除することを忘れないでください。そうしないとsuper.getItemOffsets、オフセットが上書きされます。
jayeffkay

@EyesClearはgetChildLayoutPosition使用すべきではありませんか?
Avinash R

3
これはピクセル単位の間隔を実装していますか?
filthy_wizard 2017年

108

簡単な方法は、RecyclerViewの背景色とアイテムの異なる背景色を設定することです。ここに例があります...

<android.support.v7.widget.RecyclerView
    android:background="#ECEFF1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical"/>

そして、下余白が "x" dpまたはpx のTextViewアイテム(何でもかまいません)。

<TextView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="1dp"
    android:background="#FFFFFF"/>

出力 ...

ここに画像の説明を入力してください


2
なんてこった!ロード中はリストを白に保つだけです。
Hamzeh Soboh

36
オーバードローに注意してください!
2016年

@shemは詳しく説明できますか?
RominaV 2016

7
Androidで2つのレイヤーを重ねて描画する場合(アクティビティの背景、リサイクルビューの背景、アイテムビューの背景)-Androidはすべてを描画し、ユーザーには見えないものも描画します。これはオーバードローと呼ばれ、パフォーマンスに影響を与える可能性があります。詳細については、youtube.com
watch

41

シンプルなディバイダーを使用すると

、各アイテムにディバイダーを追加するのに役立つと思い ます:
1-これをドローアブルディレクトリに追加します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="#999999" />
</shape>

2-SimpleDividerItemDecorationクラス
を作成するこの例を使用して、このクラスを定義しました。https: //gist.github.com/polbins/e37206fbc444207c0e92


package com.example.myapp;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import com.example.myapp.R;

public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration{
private Drawable mDivider;

public SimpleDividerItemDecoration(Resources resources) {
    mDivider = resources.getDrawable(R.drawable.line_divider);
}

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


3- ReCreaterViewを使用するアクティビティまたはフラグメントで、onCreateView内にこれを追加します。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
 RecyclerView myRecyclerView = (RecyclerView) layout.findViewById(R.id.my_recycler_view);
 myRecyclerView.addItemDecoration(new SimpleDividerItemDecoration(getResources()));
 ....
 }


4-アイテム間にスペースを追加
するには、アイテムビューにパディングプロパティを追加するだけです

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:padding="4dp"
>
..... item structure
</RelativeLayout>

セル間の垂直方向の仕切りも表示するために、それをGridLayoutManagerで機能させるにはどうすればよいですか?
Android開発者

2
resources.getDrawable()は非推奨になりました。コンテキストを渡して、ContextCompat.getDrawable(context、R.drawable.line_divider)を使用できます
Eric B.

36

私が設定したようにItemAnimatorsItemDecoratorアニメーションと一緒に出入りしていません。

私は単に、各アイテムのアイテムビューレイアウトファイルにビュー行を作成しただけです。それは私のケースを解決しました。DividerItemDecorationシンプルな仕切りでは魔術になりすぎると感じました。

<View
    android:layout_width="match_parent"
    android:layout_height="1px"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"
    android:background="@color/lt_gray"/>

あなたが正しいです。アニメーションはItemDecorationでは機能しません。理由はわかりませんが、何も指定しないとアニメーションが表示され、ItemDecorationによって作成された行がフォローされないことが非常に煩わしく、見苦しく感じます。だから私はあなたのような解決策を使います。
ミシェル

最後のアイテムをどのように扱いましたか?
oldergod

@oldergod。あなたは正しい痛みのポイントを指摘しました。私は最初に最後のアイテムにも仕切りがあるデザインに同意します。しかし、あなたがそれを望まないなら。このビューにIDを割り当て、位置が最後の場合はbindViewで非表示にします。
Javanator 2016

@Javanatorわかりました。私が取ったのと同じアプローチです。ありがとう。
Oldergod

最も単純なものが最高です
hyyou2010

27

これは簡単です、そのような複雑なコードは必要ありません

DividerItemDecoration divider = new 
DividerItemDecoration(mRVMovieReview.getContext(), 
DividerItemDecoration.VERTICAL);
divider.setDrawable(
    ContextCompat.getDrawable(getBaseContext(), R.drawable.line_divider)
);
mRVMovieReview.addItemDecoration(divider);

これをドローアブルに追加してください: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:height="1dp" />
    <solid android:color="@android:color/black" />
</shape>

21

マテリアルデザインを使用してこれを適切に実装する正しい方法はないため、次のトリックを実行して、リスト項目に直接ディバイダーを追加しました。

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/dividerColor"/>

マテリアルデザインの標高情報がいくつかあると、DividerItemDecorationが機能しなくなります(受信ボックスと同じ効果を得るため)。単純なことには複雑すぎます。このソリューションはシンプルで機能します。
DenisGL 2016年

21

DividerビューとDivider Insetsを処理する方法は、RecyclerView拡張機能を追加することです。

1。

ViewまたはRecyclerViewに名前を付けて、新しい拡張ファイルを追加します。

RecyclerViewExtension.kt

setDividerRecyclerViewExtension.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ようにパッケージ内に描画可能なリソースファイルを作成します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/darker_gray" />
    </shape>

</inset>

どこに左右指定することができますマージンをandroid:insetLeftandroid:insetRight

3。

RecyclerViewが初期化されているアクティビティまたはフラグメントで、次を呼び出してカスタムドローアブルを設定できます。

recyclerView.setDivider(R.drawable.recycler_view_divider)

4。

乾杯🍺

仕切り付きのRecyclerView行。


16

たとえば、アイテム間に10 dpの間隔のみを追加したい場合は、drawableを次のように設定することで追加できますDividerItemDecoration

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(
    recyclerView.getContext(),
    layoutManager.getOrientation()
);

dividerItemDecoration.setDrawable(
    ContextCompat.getDrawable(getContext(), R.drawable.divider_10dp)
); 

以下divider_10dpを含む描画可能なリソースはどこですか?

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <size android:height="10dp"/>
    <solid android:color="@android:color/transparent"/>
</shape>



11

ちょうど探している人のための項目の間のスペースRecyclerViewあなたは、私は大きなパディングを与えた最初と最後の項目を除いて、すべての項目の間に等間隔を取得する私のアプローチを参照してください。水平方向の左/右にのみパディングを適用しますLayoutManagerと垂直方向の上部/下部LayoutManager

public class PaddingItemDecoration extends RecyclerView.ItemDecoration {

    private int mPaddingPx;
    private int mPaddingEdgesPx;

    public PaddingItemDecoration(Activity activity) {
        final Resources resources = activity.getResources();
        mPaddingPx = (int) resources.getDimension(R.dimen.paddingItemDecorationDefault);
        mPaddingEdgesPx = (int) resources.getDimension(R.dimen.paddingItemDecorationEdge);
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);

        final int itemPosition = parent.getChildAdapterPosition(view);
        if (itemPosition == RecyclerView.NO_POSITION) {
            return;
        }
        int orientation = getOrientation(parent);
        final int itemCount = state.getItemCount();

        int left = 0;
        int top = 0;
        int right = 0;
        int bottom = 0;

        /** HORIZONTAL */
        if (orientation == LinearLayoutManager.HORIZONTAL) {
            /** all positions */
            left = mPaddingPx;
            right = mPaddingPx;

            /** first position */
            if (itemPosition == 0) {
                left += mPaddingEdgesPx;
            }
            /** last position */
            else if (itemCount > 0 && itemPosition == itemCount - 1) {
                right += mPaddingEdgesPx;
            }
        }
        /** VERTICAL */
        else {
            /** all positions */
            top = mPaddingPx;
            bottom = mPaddingPx;

            /** first position */
            if (itemPosition == 0) {
                top += mPaddingEdgesPx;
            }
            /** last position */
            else if (itemCount > 0 && itemPosition == itemCount - 1) {
                bottom += mPaddingEdgesPx;
            }
        }

        if (!isReverseLayout(parent)) {
            outRect.set(left, top, right, bottom);
        } else {
            outRect.set(right, bottom, left, top);
        }
    }

    private boolean isReverseLayout(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getReverseLayout();
        } else {
            throw new IllegalStateException("PaddingItemDecoration can only be used with a LinearLayoutManager.");
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getOrientation();
        } else {
            throw new IllegalStateException("PaddingItemDecoration can only be used with a LinearLayoutManager.");
        }
    }
}

dimens.xml

<resources>
    <dimen name="paddingItemDecorationDefault">10dp</dimen>
    <dimen name="paddingItemDecorationEdge">20dp</dimen>
</resources>

11

あなたの見解にマージンを加えてください、それは私のために働きました。

android:layout_marginTop="10dp"

等間隔を追加したいだけで、XMLでそれを行いたい場合は、に膨張するアイテムにと同じ量を設定paddingし、背景色に間隔カラーを決定させます。RecyclerViewlayoutMarginRecyclerView


3
これは機能しますが、これは正解ではありません。たとえば、これは行レイアウトに追加の操作を行わない限り問題を解決しないため、上部にマージンx1が表示され、行間にマージンx2が表示されます。
Sreekanth Karumanaghat

ので、これは良いアイデアではありませんoverscroll、リストの末尾に引っ張り効果が不要なパディングがパディングが適用されたときに、それに適用されますRecyclerView
AeroEchelon

:あなたがなど他の属性など標高/影を、制御することができますので、サポートライブラリCardViewに項目のレイアウトをラップすることをお勧めします <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" card_view:cardElevation="4dp" <!-- your item's XML here --> </android.support.v7.widget.CardView>
KIP2

11
  • これは分周器を追加するための簡単なハックです
  • 次のように、リサイクル業者のアイテムのレイアウトに背景を追加するだけです

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/shape_border"
        android:gravity="center"
        android:orientation="horizontal"
        android:padding="5dp">
    
    <ImageView
        android:id="@+id/imageViewContactLogo"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_marginRight="10dp"
        android:src="@drawable/ic_user" />
    
    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0.92"
        android:gravity="center|start"
        android:orientation="vertical">
    
    <TextView
        android:id="@+id/textViewContactName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    
    <TextView
        android:id="@+id/textViewStatusOrNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:singleLine="true"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium" />
    </LinearLayout>
    
    <TextView
        android:id="@+id/textViewUnreadCount"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:padding="5dp"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:textColor="@color/red"
        android:textSize="22sp" />
    
    <Button
        android:id="@+id/buttonInvite"
        android:layout_width="54dp"
        android:layout_height="wrap_content"
        android:background="@drawable/ic_add_friend" />
    </LinearLayout>

ドローアブルフォルダーに次のshape_border.xmlを作成します

  <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
      android:shape="rectangle" >
       <gradient
        android:angle="270"
        android:centerColor="@android:color/transparent"
        android:centerX="0.01"
        android:startColor="#000" />
    </shape>

これが最終結果です-仕切り付きのRecyclerView。

これが最終結果です-仕切り付きのRecyclerView。


1
これは推奨される方法ではありません。@EyesClear回答はonDrawでintを開始しparent.getChildAdapterPosition(view) != parent.getAdapter().getItemCount() - 1ますがparent.getChildAdapterPosition(view) > 0、おそらくそれが受け入れられた回答にoutRect.bottom = mVerticalSpaceHeightなるoutRect.top = mVerticalSpaceHeightはずです。
droppin_science 2015

@droppin_science-これは推奨されるアプローチではないと言うだけでは無視できません。期待どおりの正確な結果が得られます。また、EyesClearの答えも確認しますが、その答えは単純な除算器には複雑すぎますが、必要な場合アイテムで追加の装飾を行うと、それが受け入れられる答えになります。
turbandroid 2015

反対投票者の場合、この回答はDividerItemDecorationの公式クラスがなかったときに出されたので、この回答とLeo Droidcoderによって出された次の回答との時間差を比較してください。:)
turbandroid 2018年

9

古い要点からDividerItemDecorationを分岐し、ユースケースに合わせて単純化しました。また、最後のリストアイテムの後のディバイダーを含め、ListViewでのディバイダーと同じようにディバイダーを描画するように変更しました。これは、垂直方向のItemAnimatorアニメーションも処理します。

1)このクラスをプロジェクトに追加します。

public class DividerItemDecoration extends RecyclerView.ItemDecoration {
    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
    private Drawable divider;

    public DividerItemDecoration(Context context) {
        try {
            final TypedArray a = context.obtainStyledAttributes(ATTRS);
            divider = a.getDrawable(0);
            a.recycle();
        } catch (Resources.NotFoundException e) {
            // TODO Log or handle as necessary.
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        if (divider == null) return;
        if (parent.getChildAdapterPosition(view) < 1) return;

        if (getOrientation(parent) == LinearLayoutManager.VERTICAL)
            outRect.top = divider.getIntrinsicHeight();
        else
            throw new IllegalArgumentException("Only usable with vertical lists");
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if (divider == null) {
            super.onDrawOver(c, parent, state);
            return;
        }

        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 size = divider.getIntrinsicHeight();
            final int top = (int) (child.getTop() - params.topMargin - size + child.getTranslationY());
            final int bottom = top + size;
            divider.setBounds(left, top, right, bottom);
            divider.draw(c);

            if (i == childCount - 1) {
                final int newTop = (int) (child.getBottom() + params.bottomMargin + child.getTranslationY());
                final int newBottom = newTop + size;
                divider.setBounds(left, newTop, right, newBottom);
                divider.draw(c);
            }
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (!(parent.getLayoutManager() instanceof LinearLayoutManager))
            throw new IllegalStateException("Layout manager must be an instance of LinearLayoutManager");
        return ((LinearLayoutManager) parent.getLayoutManager()).getOrientation();
    }
}

2)RecylerViewにデコレーターを追加します。

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

正解です。これは、LinearLayoutManager用です。その背後にあるアイデアを取り入れて、GridLayoutManagerに適合させることができます。
OpenGL ESを学ぶ

8

を作成する代わりにshape xml、仕切りの高さと色を変更します。次のようにプログラムで作成できます

val divider = DividerItemDecoration(context,
        DividerItemDecoration.VERTICAL)

divider.setDrawable(ShapeDrawable().apply {
    intrinsicHeight = resources.getDimensionPixelOffset(R.dimen.dp_15)
    paint.color = Color.RED // note: currently (support version 28.0.0), we can not use tranparent color here, if we use transparent, we still see a small divider line. So if we want to display transparent space, we can set color = background color or we can create a custom ItemDecoration instead of DividerItemDecoration. 
})

recycler_devices.addItemDecoration(divider)

これは便利な答えです
taha

7

グーグル検索から取られて、このItemDecorationをあなたに追加してくださいRecyclerView

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

private Drawable mDivider;
private boolean mShowFirstDivider = false;
private boolean mShowLastDivider = false;


public DividerItemDecoration(Context context, AttributeSet attrs) {
    final TypedArray a = context
            .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider});
    mDivider = a.getDrawable(0);
    a.recycle();
}

public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider,
        boolean showLastDivider) {
    this(context, attrs);
    mShowFirstDivider = showFirstDivider;
    mShowLastDivider = showLastDivider;
}

public DividerItemDecoration(Drawable divider) {
    mDivider = divider;
}

public DividerItemDecoration(Drawable divider, boolean showFirstDivider,
        boolean showLastDivider) {
    this(divider);
    mShowFirstDivider = showFirstDivider;
    mShowLastDivider = showLastDivider;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
        RecyclerView.State state) {
    super.getItemOffsets(outRect, view, parent, state);
    if (mDivider == null) {
        return;
    }
    if (parent.getChildPosition(view) < 1) {
        return;
    }

    if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
        outRect.top = mDivider.getIntrinsicHeight();
    } else {
        outRect.left = mDivider.getIntrinsicWidth();
    }
}

@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
    if (mDivider == null) {
        super.onDrawOver(c, parent, state);
        return;
    }

    // Initialization needed to avoid compiler warning
    int left = 0, right = 0, top = 0, bottom = 0, size;
    int orientation = getOrientation(parent);
    int childCount = parent.getChildCount();

    if (orientation == LinearLayoutManager.VERTICAL) {
        size = mDivider.getIntrinsicHeight();
        left = parent.getPaddingLeft();
        right = parent.getWidth() - parent.getPaddingRight();
    } else { //horizontal
        size = mDivider.getIntrinsicWidth();
        top = parent.getPaddingTop();
        bottom = parent.getHeight() - parent.getPaddingBottom();
    }

    for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) {
        View child = parent.getChildAt(i);
        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

        if (orientation == LinearLayoutManager.VERTICAL) {
            top = child.getTop() - params.topMargin;
            bottom = top + size;
        } else { //horizontal
            left = child.getLeft() - params.leftMargin;
            right = left + size;
        }
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }

    // show last divider
    if (mShowLastDivider && childCount > 0) {
        View child = parent.getChildAt(childCount - 1);
        RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
        if (orientation == LinearLayoutManager.VERTICAL) {
            top = child.getBottom() + params.bottomMargin;
            bottom = top + size;
        } else { // horizontal
            left = child.getRight() + params.rightMargin;
            right = left + size;
        }
        mDivider.setBounds(left, top, right, bottom);
        mDivider.draw(c);
    }
}

private int getOrientation(RecyclerView parent) {
    if (parent.getLayoutManager() instanceof LinearLayoutManager) {
        LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
        return layoutManager.getOrientation();
    } else {
        throw new IllegalStateException(
                "DividerItemDecoration can only be used with a LinearLayoutManager.");
    }
}
}

これは、LinearLayoutManagerでのみ機能します。GridLayoutManagerに対して何を行う必要がありますか?
Android開発者

6

このリンクは私にとって魅力のように機能しました:

https://gist.github.com/lapastillaroja/858caf1a82791b6c1a36

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private Drawable mDivider;
    private boolean mShowFirstDivider = false;
    private boolean mShowLastDivider = false;


    public DividerItemDecoration(Context context, AttributeSet attrs) {
        final TypedArray a = context
                .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider});
        mDivider = a.getDrawable(0);
        a.recycle();
    }

    public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider,
            boolean showLastDivider) {
        this(context, attrs);
        mShowFirstDivider = showFirstDivider;
        mShowLastDivider = showLastDivider;
    }

    public DividerItemDecoration(Drawable divider) {
        mDivider = divider;
    }

    public DividerItemDecoration(Drawable divider, boolean showFirstDivider,
            boolean showLastDivider) {
        this(divider);
        mShowFirstDivider = showFirstDivider;
        mShowLastDivider = showLastDivider;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
            RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        if (mDivider == null) {
            return;
        }
        if (parent.getChildPosition(view) < 1) {
            return;
        }

        if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {
            outRect.top = mDivider.getIntrinsicHeight();
        } else {
            outRect.left = mDivider.getIntrinsicWidth();
        }
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        if (mDivider == null) {
            super.onDrawOver(c, parent, state);
            return;
        }

        // Initialization needed to avoid compiler warning
        int left = 0, right = 0, top = 0, bottom = 0, size;
        int orientation = getOrientation(parent);
        int childCount = parent.getChildCount();

        if (orientation == LinearLayoutManager.VERTICAL) {
            size = mDivider.getIntrinsicHeight();
            left = parent.getPaddingLeft();
            right = parent.getWidth() - parent.getPaddingRight();
        } else { //horizontal
            size = mDivider.getIntrinsicWidth();
            top = parent.getPaddingTop();
            bottom = parent.getHeight() - parent.getPaddingBottom();
        }

        for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) {
            View child = parent.getChildAt(i);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();

            if (orientation == LinearLayoutManager.VERTICAL) {
                top = child.getTop() - params.topMargin;
                bottom = top + size;
            } else { //horizontal
                left = child.getLeft() - params.leftMargin;
                right = left + size;
            }
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }

        // show last divider
        if (mShowLastDivider && childCount > 0) {
            View child = parent.getChildAt(childCount - 1);
            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
            if (orientation == LinearLayoutManager.VERTICAL) {
                top = child.getBottom() + params.bottomMargin;
                bottom = top + size;
            } else { // horizontal
                left = child.getRight() + params.rightMargin;
                right = left + size;
            }
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    private int getOrientation(RecyclerView parent) {
        if (parent.getLayoutManager() instanceof LinearLayoutManager) {
            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();
            return layoutManager.getOrientation();
        } else {
            throw new IllegalStateException(
                    "DividerItemDecoration can only be used with a LinearLayoutManager.");
        }
    }
}

次に、あなたの活動で:

mCategoryRecyclerView.addItemDecoration(
    new DividerItemDecoration(this, null));

または、フラグメントを使用している場合:

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

1
これは正常に機能しますが、リストの最後の項目の下に仕切りは表示されません。:私はこのようにそれを必要とするmShowFirstDivider = falsemShowLastDivider = trueが、それは動作しません。なぜか?
2015年

これは、GridLayoutManagerをうまく処理できません。
Android開発者

6

DividerItemDecorationなど、recyclerviewに接続されたさまざまなデコレータを使用してアイテムを装飾できます。

単に以下を使用してください... EyesClearによる回答からの引用

public class DividerItemDecoration extends RecyclerView.ItemDecoration {

private static final int[] ATTRS = new int[]{android.R.attr.listDivider};

private Drawable mDivider;

/**
 * Default divider will be used
 */
public DividerItemDecoration(Context context) {
    final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
    mDivider = styledAttributes.getDrawable(0);
    styledAttributes.recycle();
}

/**
 * Custom divider will be used
 */
public DividerItemDecoration(Context context, int resId) {
    mDivider = ContextCompat.getDrawable(context, resId);
}

@Override
public void onDraw(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);
    }
}

次に、上記を次のように使用します

RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST);
recyclerView.addItemDecoration(itemDecoration);

これにより、以下に示すように、リスト内の各項目間の仕切りが表示されます。

ここに画像の説明を入力してください

詳細についてはこのガイドご覧ください 。RecyclerViewの使用_ CodePath Android Cliffnotes

ここでいくつかの回答はマージンの使用を提案していますが、問題は次のとおりです。上部と下部の両方のマージンを追加すると、アイテム間に追加されたように見え、大きすぎます。どちらかだけを追加した場合、リスト全体の上部または下部にマージンはありません。距離の半分を上部に、半分を下部に追加すると、外側のマージンが小さすぎます。

したがって、審美的に正しい唯一のソリューションは、システムが適切に適用する場所を知っているディバイダーです。

以下のコメント欄に疑問点があれば教えてください:)


1
これはDividerItemDecorationコードがどのように見えるかをデモしません。
IgorGanapolsky 2015

1
そのAOSPクラス、私はあなたのためにコードを掘り起こしました..... gist.githubusercontent.com/alexfu/0f464fc3742f134ccd1e/raw/…– Anudeep Samaiya '25
09/25

うまく機能しません:高さの異なる行を処理せず、グリッドの垂直方向の仕切りも表示されません
Android開発者

5

遅すぎますが、GridLayoutManager私はこれを使用します:

public class GridSpacesItemDecoration : RecyclerView.ItemDecoration
{
    private int space;

    public GridSpacesItemDecoration(int space) {
        this.space = space;
    }

    public override void GetItemOffsets(Android.Graphics.Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
    {
        var position = parent.GetChildLayoutPosition(view);

        /// Only for GridLayoutManager Layouts
        var manager = parent.GetLayoutManager() as GridLayoutManager;

        if (parent.GetChildLayoutPosition(view) < manager.SpanCount)
            outRect.Top = space;

        if (position % 2 != 0) {
            outRect.Right = space;
        }

        outRect.Left = space;
        outRect.Bottom = space;
    }
}

これは、スパン数に関係なく機能します。

Ollie。


トップスペースについて、サポートにも変更するにはどうすればFlexboxLayoutManagerいいですか?
Androidデベロッパー

5

プログラムで簡単に追加できます。

レイアウトマネージャーがLinearlayoutの場合は、以下を使用できます。

DividerItemDecorationは、LinearLayoutManagerの項目間の仕切りとして使用できるRecyclerView.ItemDecorationです。水平方向と垂直方向の両方をサポートしています。

 mDividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
         mLayoutManager.getOrientation());
 recyclerView.addItemDecoration(mDividerItemDecoration);

ソース


5

XMLを使用しないシンプルなコードベースの回答が必要だと感じています

DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);

ShapeDrawable shapeDrawableForDivider = new ShapeDrawable(new RectShape());

int dividerThickness = // (int) (SomeOtherView.getHeight() * desiredPercent);
shapeDrawableForDivider.setIntrinsicHeight(dividerThickness);
shapeDrawableForDivider.setAlpha(0);

dividerItemDecoration.setDrawable(shapeDrawableForDivider);

recyclerView.addItemDecoration(dividerItemDecoration);

4

アイテムに同じスペースを追加する場合、最も簡単な方法は、RecycleViewの上部+左のパディングと右+下部のマージンをカードアイテムに追加することです。

dimens.xml

<resources>
    <dimen name="divider">1dp</dimen>
</resources>

list_item.xml

<CardView
 android:layout_marginBottom="@dimen/divider"
 android:layout_marginRight="@dimen/divider">
 ...
</CardView>

list.xml

<RecyclerView
 android:paddingLeft="@dimen/divider"
 android:paddingTop="@dimen/divider"
/>

4

以下のようなリスト項目に行を追加しました

<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@color/dividerColor"/>

1pxは細い線を描画します。

最後の行の仕切りを非表示にする場合divider.setVisiblity(View.GONE);は、最後のリスト項目のonBindViewHolderで。


1
私はこれを好むが、他のものは複雑すぎる。
Sam Chen

3

はとRecyclerViewは少し異なりListViewます。実際には、そのような構造RecyclerViewが必要ListViewです。たとえば、LinearLayout。にLinearLayoutは、各要素を分割するためのパラメータがあります。以下のコードでは、アイテムの間にスペースを置く「パディング」をRecyclerView含むCardViewオブジェクトで構成さLinearLayoutれています。そのスペースを本当に小さくすると、ラインができます。

これがrecyclerview_layout.xmlのRecyclerビューです

<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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".ToDoList">

    <!-- A RecyclerView with some commonly used attributes -->
    <android.support.v7.widget.RecyclerView
        android:id="@+id/todo_recycler_view"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

そして、各アイテムは次のようになります(そして、すべてを囲むLinearLayoutのandroid:paddingにより分割されて表示されます)。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    **android:padding="@dimen/activity_vertical_margin"**>
    <!-- A CardView that contains a TextView -->
    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:elevation="30dp"
        card_view:cardElevation="3dp">
            <TextView
                android:id="@+id/info_text"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                />
    </android.support.v7.widget.CardView>
</LinearLayout>

3

本当に簡単な解決策は、RecyclerView-FlexibleDividerを使用することです。

依存関係を追加します。

compile 'com.yqritc:recyclerview-flexibledivider:1.4.0'

recyclerviewに追加:

recyclerView.addItemDecoration(new HorizontalDividerItemDecoration.Builder(context).build());

これで完了です。


魅力のように動作します...オープンソースの共有が大好きです。
ビリー

3

1.Oneの方法は、cardviewとrecycler viewを一緒 に使用することで、ディバイダーのような効果を簡単に追加できます。例:https://developer.android.com/training/material/lists-cards.html

2.その他は、ビューをリサイクラービューのlist_item_layoutにディバイダーとして追加することです。

        <View
            android:id="@+id/view1"
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/colorAccent" />

3
public class CommonItemSpaceDecoration extends RecyclerView.ItemDecoration {

        private int mSpace = 0;
        private boolean mVerticalOrientation = true;

    public CommonItemSpaceDecoration(int space) {
        this.mSpace = space;
    }

    public CommonItemSpaceDecoration(int space, boolean verticalOrientation) {
        this.mSpace = space;
        this.mVerticalOrientation = verticalOrientation;
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.top = SizeUtils.dp2px(view.getContext(), mSpace);
        if (mVerticalOrientation) {
            if (parent.getChildAdapterPosition(view) == 0) {
                outRect.set(0, SizeUtils.dp2px(view.getContext(), mSpace), 0, SizeUtils.dp2px(view.getContext(), mSpace));
            } else {
                outRect.set(0, 0, 0, SizeUtils.dp2px(view.getContext(), mSpace));
            }
        } else {
            if (parent.getChildAdapterPosition(view) == 0) {
                outRect.set(SizeUtils.dp2px(view.getContext(), mSpace), 0, 0, 0);
            } else {
                outRect.set(SizeUtils.dp2px(view.getContext(), mSpace), 0, SizeUtils.dp2px(view.getContext(), mSpace), 0);
            }
        }
    }
}

これにより、すべてのアイテムの上下(または左右)にスペースが追加されますrecyclerView。次に、に設定できます。

recyclerView.addItemDecoration(new CommonItemSpaceDecoration(16));

SizeUtils.java

public class SizeUtils {
    public static int dp2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.