私はXMLの下で使用した角を丸くするために、角の丸いRecyclerView
を使用しています:
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>
取得(アイテムセパレータなし):
必須(アイテム区切り付き):
あなたはディバイダーを追加してみてください
mListview.addItemDecoration(new DividerItemDecoration(this.getActivity(), LinearLayout.VERTICAL));
私はこのようにしました:
onCreateView()フラグメント:
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>
これがあなたのお役に立てば幸いです。
RecyclerViewには、仕切りを表示するための仕切り関連のパラメータはありません。代わりに、ItemDecorationからクラスを拡張し、addItemDecoration()メソッドを使用して仕切りを表示する必要があります。
DividerItemDecoration.Javaという名前のクラスを作成し、次のコードを貼り付けます。
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);
}
}
}
Activity.Javaを開き、アダプターを設定する前にaddItemDecoration()メソッドを使用してアイテム装飾を設定します。
recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
// set the adapter
recyclerView.setAdapter(mAdapter);
RecyclerViewはListViewsとは異なります。リサイクラビューにItemDecoratorsを追加する必要があります。ドキュメントが言うように、
ItemDecorationを使用すると、アプリケーションは、アダプターのデータセットから特定のアイテムビューに特別な図面とレイアウトオフセットを追加できます。これは、アイテム間の区切り線の描画、ハイライト、視覚的なグループ化境界などに役立ちます。
このリンクをご覧ください: https://developer.Android.com/reference/Android/support/v7/widget/RecyclerView.ItemDecoration.html
このコード行は私のために働いた:
recyclerView.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.HORIZONTAL));
垂直線の場合、2番目の引数をDividerItemDecoration.VERTICAL
として渡します。
Recyclerviewに仕切りを追加するには、プロジェクトに追加した後にデコレータ- https://Gist.github.com/alexfu/0f464fc3742f134ccd1e を使用する必要があります行を追加recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
これを達成するためにやったことは、最初にアダプタ行のレイアウトを作成しました
<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>
次に、アダプターで最初の行をチェックし、viewLine Visibilityを非表示に変更しました
@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);
//...
}
}
これを試してください:非常に素晴らしい solution by Michel-F。ポーツァルト
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);
}
}
カスタムアダプターを使用している場合は、レイアウトのリストアイテムの背景にセレクターを設定します
textviewとlistviewの両方の背景にlist_selectorを設定しています。 list_selectorはlistviewにのみ使用し、textviewにもホバー効果を適用する場合は、<corners Android:radius="10dp"
プロパティを含まない別のlist_selector_textviewを作成します。
試してみてください 参照 Android:角が丸いリストビュー
まず、リストエントリの背景用のドロアブルが必要です。リストの中央のエントリでは、角を丸くする必要はありません。そのため、次のコンテンツを使用して、ドロアブルフォルダ「list_entry_middle.xml」にxmlを作成します。
<?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>
角が丸い場合は、別の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>
BottomLeftRadiusとbottomRightRadiusを使用するだけで、下部の実装はまったく同じです。 (おそらく、リストにエントリが1つしかない場合は、すべての角を丸くしたものも作成します)使いやすさを高めるために、さまざまな状態に対応する他の色のドロアブルも提供します「selector_rounded_corner_top.xml」)次のように:
<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>
次に、リストの他の背景についても同じことを行います。あとは、ListAdapterで次のように適切な背景を割り当てるだけです。
@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
}
これを試して
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>
あなたのリストビュー:
<ListView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/mylst"
Android:background="@drawable/custom_rounded_list" />
ListViewを次のように変更します。list_bgをListViewの背景として追加します。また、listViewの上部と下部にパディングを指定します。
<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" />
たった1行...
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), null));
それで全部です
このドローアブルxmlを曲線形状のリストビューに使用し、背景をリストビューまたはレイアウトに設定します。
<?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>
問題は、リストビューだけでなくアイテムにも背景の角を設定しているためです。アイテム用のセレクター付きの背景とコーナー付きのリストビュー用の背景を別々に作成する必要があります。
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>
これで、このドロアブルをリストビューの背景として設定できます。
<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" />
リストビュー項目の場合、セレクターを使用してホバー機能を使用できます。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"/>
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>
その後、このセレクターをxmlのアイテムに設定できます。
<TextView
Android:id="@+id/textView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@drawable/list_item_selector" />
したがって、リストビューには常に角のある同じ背景があり、リストビューの項目の背景には角がなく、押された状態または選択された状態で変更されます。