web-dev-qa-db-ja.com

Android:RecyclerViewのアイテム間に仕切りを追加します

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

取得(アイテムセパレータなし):

enter image description here

必須(アイテム区切り付き):

enter image description here

15
Sun

あなたはディバイダーを追加してみてください

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

私はこのようにしました:

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_horizo​​ntal_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>

これがあなたのお役に立てば幸いです。

6
Hiren Patel

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);
3
Arpit Patel

RecyclerViewはListViewsとは異なります。リサイクラビューにItemDecoratorsを追加する必要があります。ドキュメントが言うように、

ItemDecorationを使用すると、アプリケーションは、アダプターのデータセットから特定のアイテムビューに特別な図面とレイアウトオフセットを追加できます。これは、アイテム間の区切り線の描画、ハイライト、視覚的なグループ化境界などに役立ちます。

このリンクをご覧ください: https://developer.Android.com/reference/Android/support/v7/widget/RecyclerView.ItemDecoration.html

2
Riyaz Ahamed

このコード行は私のために働いた:

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

垂直線の場合、2番目の引数をDividerItemDecoration.VERTICALとして渡します。

1

Recyclerviewに仕切りを追加するには、プロジェクトに追加した後にデコレータ- https://Gist.github.com/alexfu/0f464fc3742f134ccd1e を使用する必要があります行を追加recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));

1
Viktor Yakunin

これを達成するためにやったことは、最初にアダプタ行のレイアウトを作成しました

    <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);
        //... 
    }
}
1
Sushant

これを試してください:非常に素晴らしい 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);
    }
}
0
NickF

カスタムアダプターを使用している場合は、レイアウトのリストアイテムの背景にセレクターを設定します

0
vs.thaakur

textviewとlistviewの両方の背景にlist_selectorを設定しています。 list_selectorはlistviewにのみ使用し、textviewにもホバー効果を適用する場合は、<corners Android:radius="10dp"プロパティを含まない別のlist_selector_textviewを作成します。

0
Irfan Ali

試してみてください 参照 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
   }
0
SelvaMariappan

これを試して

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

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" />
0
Dominic D'Souza

たった1行...

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

それで全部です

0
Ravi

このドローアブル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>
0
Surender Kumar

問題は、リストビューだけでなくアイテムにも背景の角を設定しているためです。アイテム用のセレクター付きの背景とコーナー付きのリストビュー用の背景を別々に作成する必要があります。

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