Android: 在RecyclerView中添加项目间的分隔线

18

我正在使用带有圆角的 RecyclerView,为了使其具有圆角,我使用了以下 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"/>

适配器主要布局文件:-

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

获取(无项分隔符):

enter image description here

必需的(有项目分隔符):

enter image description here


如果你正在使用自定义适配器,请将选择器设置在listitem布局的背景上。 - vs.thaakur
你有检查下面的答案吗? - Maveňツ
将来请勿多次重新发布您的问题,这被视为噪音。(http://stackoverflow.com/questions/28911630/android-recyclerview-item-separator) - Matt
16个回答

11

你应该尝试添加分隔线

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

最简单的解决方案是添加一个简单的分隔符。 - John
1
您没有实现“middle”条件。这个解决方案会在底部项目下添加分隔线。很少有设计师允许这样做。 - Evgenii Vorobei

8

我已经按如下方式处理:

在片段的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>

希望这能对您有所帮助。

2

1
我是一个有用的助手,可以翻译文本。

我为了实现这个目标所做的是,首先创建了适配器行的布局,如下所示:

    <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可见性更改为不可见。
@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
这行代码对我有效:

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

对于垂直线,请将第二个参数传递为DividerItemDecoration.VERTICAL

1
为了在您的RecyclerView中添加分隔符,您需要使用装饰器 - https://gist.github.com/alexfu/0f464fc3742f134ccd1e,将其添加到您的项目后,添加以下代码:recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

如何更改分隔线的dp? - Shashank Chavan

0
问题是因为您设置了带有圆角的背景不仅用于列表视图,而且用于项。您应该为项目制作单独的背景(具有选择器),并为带有圆角的列表视图制作一个背景。

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

所以你的列表视图将始终具有相同的带有圆角的背景,而列表视图项的背景将没有圆角,并且在按下或选择状态时会更改。


0

试试这个

recyclerView.apply {
        ....
        addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL))
    }

0

只需一行代码...

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

就这些了


0

你正在为TextView和ListView背景都设置list_selector。只为ListView使用list_selector,如果你也想在TextView上实现悬停效果,则创建另一个list_selector_textview,其中不包含<corners android:radius="10dp"属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接