私はRecyclerView
を使用しているAndroidアプリケーションを開発しています。 RecyclerView
に divider を追加する必要があります。追加しようとしました -
recyclerView.addItemDecoration(new
DividerItemDecoration(getActivity(),
DividerItemDecoration.VERTICAL_LIST));
以下は私のXMLコードです -
<Android.support.v7.widget.RecyclerView
Android:id="@+id/drawerList"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="15dp"
/>
2016年10月のアップデートでは、サポートライブラリv25.0.0に、基本的な水平方向と垂直方向の境界線がデフォルトで実装されました。
https://developer.Android.com/reference/Android/support/v7/widget/DividerItemDecoration.html
recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL));
正しい方法はItemDecoration
に対してRecyclerView
を定義することです。
SimpleDividerItemDecoration.Java
public class SimpleDividerItemDecoration extends RecyclerView.ItemDecoration {
private Drawable mDivider;
public SimpleDividerItemDecoration(Context context) {
mDivider = context.getResources().getDrawable(R.drawable.line_divider);
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int top = child.getBottom() + params.bottomMargin;
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
}
line_divider.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:shape="rectangle">
<size
Android:width="1dp"
Android:height="1dp" />
<solid Android:color="@color/dark_gray" />
</shape>
最後にこのように設定してください
recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
@Alan Solitarが指摘したように
context.getResources().getDrawable(R.drawable.line_divider);
あなたが使うことができるのではなく、廃止予定です
ContextCompat.getDrawable(context,R.drawable.line_divider);
水平方向と垂直方向の両方の分割線が必要な場合は、次のようにします。
水平方向と垂直方向の仕切りのドロアブルを定義します。
<?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>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<size Android:width="1dip" />
<solid Android:color="#22000000" />
</shape>
以下にこのコードセグメントを追加してください。
DividerItemDecoration verticalDecoration = new DividerItemDecoration(recyclerview.getContext(),
DividerItemDecoration.HORIZONTAL);
Drawable verticalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.vertical_divider);
verticalDecoration.setDrawable(verticalDivider);
recyclerview.addItemDecoration(verticalDecoration);
DividerItemDecoration horizontalDecoration = new DividerItemDecoration(recyclerview.getContext(),
DividerItemDecoration.VERTICAL);
Drawable horizontalDivider = ContextCompat.getDrawable(getActivity(), R.drawable.horizontal_divider);
horizontalDecoration.setDrawable(horizontalDivider);
recyclerview.addItemDecoration(horizontalDecoration);
アイテムアダプタの最後までにビューを追加するだけです。
<View
Android:layout_width="match_parent"
Android:layout_height="1px"
Android:background="#FFFFFF"/>
更新:
より良い結果を得るには、1px
を1dp
に変換してください。
<View
Android:layout_width="match_parent"
Android:layout_height="1dp"
Android:background="#FFFFFF"/>
これらすべての答えにより私は親密になりましたが、それらはそれぞれ重要な詳細を欠いていました。ちょっとした調査の結果、最も簡単な方法はこれら3つのステップを組み合わせたものであることがわかりました。
ステップ1:RecyclerViewの設定中
recyclerView.addItemDecoration(
new DividerItemDecoration(context, layoutManager.getOrientation()));
ステップ2:res/drawable/divider_gray.xmlのようなファイルに
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android">
<size Android:width="1px" Android:height="1px" />
<solid Android:color="@color/gray" />
</shape>
ステップ3:アプリのテーマに
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Other theme items above -->
<item name="Android:listDivider">@drawable/divider_gray</item>
</style>
編集:最後の区切り文字をスキップするように更新された:
これを少し使用した後、私はそれが最後の項目の後に仕切りを描いていたことに気付きました。そのため、DividerItemDecorationのデフォルトの動作をオーバーライドするためにStep 1を次のように変更しました(もちろん、別のクラスを作成することも別の選択肢です)。
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);
}
}
}
);
これは簡単なカスタム仕切りのコードです(垂直仕切り/ 1dpの高さ/黒):
サポートライブラリがあるとします。
compile "com.Android.support:recyclerview-v7:25.1.1"
Javaコード
DividerItemDecoration divider = new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL);
divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.my_custom_divider));
recyclerView.addItemDecoration(divider);
次にcustom_divider.xmlファイルのサンプル
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="rectangle">
<size Android:height="1dp" />
<solid Android:color="@Android:color/black" />
</shape>
Fragments
を使うためにRecyclerView
を使っていると思います
RecyclerView
およびLayoutManager
オブジェクトを作成した後でこれらの行を追加するだけです。
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),
DividerItemDecoration.VERTICAL);
recyclerView.addItemDecoration(dividerItemDecoration);
それでおしまい!
それは水平方向と垂直方向の両方をサポートしています。
res/drawable フォルダーに個別の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>
このxmlファイル(your_file)を mainアクティビティ に接続します。
DividerItemDecoration divider = new DividerItemDecoration(
recyclerView.getContext(),
DividerItemDecoration.VERTICAL
);
divider.setDrawable(ContextCompat.getDrawable(getBaseContext(), R.drawable.your_file));
recyclerView.addItemDecoration(divider);
それでこれは正しい方法ではないかもしれませんが、私はちょうどRecyclerViewの単一項目ビューにビューを追加しました(私は組み込み関数があるとは思わないので):
<View
Android:layout_width="fill_parent"
Android:layout_height="@dimen/activity_divider_line_margin"
Android:layout_alignParentBottom="true"
Android:background="@color/tasklist_menu_dividerline_grey" />
これは、各項目の一番下にそれを埋める線が表示されることを意味します。私は#111111
を背景にして1dpくらいの高さにしました。これはまたそれに一種の "3D"効果を与えます。
この単純な単一行コードを試す
recyclerView.addItemDecoration(new DividerItemDecoration(getContext(),LinearLayoutManager.VERTICAL));
次の行を追加する必要があります...
mRecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL));
簡単な再利用可能な仕切りを作成できます。
仕切りを作成:
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);
}
}
}
仕切り線を作成する: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>
あなたのRecyclerviewに仕切りを追加する:
RecyclerView.ItemDecoration dividerItemDecoration = new DividerItemDecorator(ContextCompat.getDrawable(context, R.drawable.divider));
recyclerView.addItemDecoration(dividerItemDecoration);
最後の商品の仕切りを削除するには:
最後のアイテムのデバイダ描画を防ぐには、この線を変更する必要があります。
for (int i = 0; i < childCount; i++)
に
for (int i = 0; i < childCount-1; i++)
最終的な実装は次のようになります。
public class DividerItemDecorator extends RecyclerView.ItemDecoration {
private Drawable mDivider;
public DividerItemDecorator(Drawable divider) {
mDivider = divider;
}
@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
int dividerLeft = parent.getPaddingLeft();
int dividerRight = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount - 1; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
int dividerTop = child.getBottom() + params.bottomMargin;
int dividerBottom = dividerTop + mDivider.getIntrinsicHeight();
mDivider.setBounds(dividerLeft, dividerTop, dividerRight, dividerBottom);
mDivider.draw(canvas);
}
}
}
それが役に立てば幸い:)
yqritcの RecyclerView-FlexibleDivider はこれをワンライナーにします。まずこれをあなたのbuild.gradle
に追加してください:
compile 'com.yqritc:recyclerview-flexibledivider:1.4.0' // requires jcenter()
これで、recyclerViewのアダプタを設定するためのdivderを設定して追加できます。
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(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))
N Jの答えをもう少し簡単にするには、次のようにします。
public class DividerColorItemDecoration extends DividerItemDecoration {
public DividerColorItemDecoration(Context context, int orientation) {
super(context, orientation);
setDrawable(ContextCompat.getDrawable(context, R.drawable.line_divider));
}
}
Androidは、残念ながらちょっとしたことが複雑すぎます。ここでDividerItemDecorationを実装せずに、必要なものを実現するための最も簡単な方法:
RecyclerViewの背景色を好みのディバイダ色に追加します。
<RecyclerView
Android:id="@+id/rvList"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:divider="@color/colorLightGray"
Android:scrollbars="vertical"
tools:listitem="@layout/list_item"
Android:background="@Android:color/darker_gray"/>
アイテムのレイアウトルート(list_item.xml)に下余白(Android:layout_marginBottom)を追加します。
<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>
これにより、アイテムとRecyclerViewの背景色との間に1dpの間隔が空けられます(ダークグレーは仕切りとして表示されます)。
RecycleView Adapter
の項目の下部にxの余白を追加するだけです。
onCreateViewHolder
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
layoutParams.setMargins(0, 0, 0, 5);
itemView.setLayoutParams(layoutParams);
recyclerview.addItemDecoration(new DividerItemDecoration(this, 0));
0
は水平、1
は垂直です