J'utilise RecyclerView
avec un coin arrondi, pour le faire, j'ai utilisé ci-dessous 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>
Obtenir (sans séparateur d'article):
Obligatoire (avec séparateur d'article):
J'ai fait comme ça:
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>
J'espère que ceci vous aidera.
vous devriez essayer d'ajouter Divider
mListview.addItemDecoration(new DividerItemDecoration(this.getActivity(), LinearLayout.VERTICAL));
RecyclerView n’a aucun paramètre associé au diviseur pour l’afficher. Au lieu de cela, vous devez étendre une classe à partir de ItemDecoration et utiliser la méthode addItemDecoration () pour afficher le diviseur.
Créez une classe nommée DividerItemDecoration.Java et collez le code ci-dessous.
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);
}
}
}
Ouvrez Activity.Java et définissez la décoration d’article à l’aide de la méthode addItemDecoration () avant de configurer l’adaptateur.
recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
// set the adapter
recyclerView.setAdapter(mAdapter);
RecyclerView fonctionne différemment de ListViews. Vous devez ajouter ItemDecorators pour la vue recycleur. Comme le dit la documentation,
ItemDecoration permet à l'application d'ajouter un dessin spécial et un décalage de présentation à des vues d'élément spécifiques à partir du jeu de données de l'adaptateur. Cela peut être utile pour tracer des séparations entre les éléments, les surbrillances, les limites de regroupement visuel, etc.
Jetez un oeil sur ce lien: https://developer.Android.com/reference/Android/support/v7/widget/RecyclerView.ItemDecoration.html
Pour ajouter des séparateurs à votre liste de recyclage, vous devez utiliser decorator - https://Gist.github.com/alexfu/0f464fc3742f134ccd1e après avoir ajouté une ligne à votre projet recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
Eh bien, ce que j’ai fait pour y parvenir, c’est la première fois que j’ai créé la mise en page de ma ligne d’adaptateur.
<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>
Ensuite, dans mon adaptateur, j'ai vérifié la première ligne et modifié la visibilité de viewLine en 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);
//...
}
}
Essayez celui-ci: Un très joli solution 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);
}
}
Définissez le sélecteur à l'arrière-plan de l'élément de liste de votre mise en page si vous utilisez un adaptateur personnalisé.
vous définissez list_selector à la fois pour textview et listview. Utilisez list_selector uniquement pour listview et si vous souhaitez également appliquer un effet de survol sur textview, créez-en un autre, list_selector_textview qui n'inclut pas la propriété <corners Android:radius="10dp"
.
Cette ligne de code a fonctionné pour moi:
recyclerView.addItemDecoration(new DividerItemDecoration(context, DividerItemDecoration.HORIZONTAL));
Pour la ligne verticale, passez le second argument sous la forme DividerItemDecoration.VERTICAL
.
Essayez ceci à partir de Référence Android: ListView avec coins arrondis
Tout d’abord, nous avons besoin des éléments dessinables pour les arrière-plans des entrées de la liste: contenu suivant:
<?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>
Pour les coins arrondis, créez un autre 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>
L'implémentation de la partie inférieure est à peu près la même chose, juste avec bottomLeftRadius et bottomRightRadius. (peut-être aussi en créer un avec tous les coins arrondis, si la liste ne comporte qu'une entrée) dossier pouvant être dessiné ("selector_rounded_corner_top.xml") comme suit:
<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>
Maintenant, faites la même chose pour les autres arrière-plans de la liste . Il ne reste plus qu'à assigner les bons arrière-plans dans notre ListAdapter comme suit:
@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
}
Essaye ça
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>
Votre listview:
<ListView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@+id/mylst"
Android:background="@drawable/custom_rounded_list" />
Modifiez votre ListView comme ci-dessous.Ajoutez list_bg comme arrière-plan de votre ListView. Spécifiez également un remplissage pour le haut et le bas de la liste. Sinon, le premier et le dernier élément de la liste chevaucheront les coins arrondis affichant des coins rectangulaires.
<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" />
Juste une ligne ...
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), null));
C'est tout
Utilisez ce xml dessinable pour la vue de liste de forme de courbe et définissez l’arrière-plan de votre vue Liste ou de tout modèle
<?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>
Le problème vient du fait que vous définissez l’arrière-plan avec des angles non seulement pour la vue liste, mais également pour l’élément. Vous devez créer des arrière-plans distincts pour les éléments (avec sélecteur) et un pour la vue liste avec coins.
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>
Vous pouvez maintenant configurer ce dessin comme fond d’écran de votre vue liste.
<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" />
Et pour les éléments de la vue liste, vous pouvez utiliser le sélecteur pour disposer de la fonctionnalité de survol: 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"/>
Où list_item_selected est: 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>
Et après cela, vous pouvez configurer ce sélecteur pour l'élément dans votre code XML:
<TextView
Android:id="@+id/textView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="@drawable/list_item_selector" />
Ainsi, votre vue en liste aura toujours le même arrière-plan avec les coins, et l'arrière-plan des éléments de la vue en liste sera sans coins et sera modifié dans l'état sélectionné ou pressé.