Androidでリストビューアイテム間のスペースを設定する方法


371

listViewでmarginBottomを使用して、listViewアイテムの間にスペースを作ろうとしましたが、それでもアイテムは一緒にアタッチされています。

可能ですか?はいの場合、具体的な方法はありますか?

私のコードは以下です

<LinearLayout
android:id="@+id/alarm_occurences"
android:layout_width="fill_parent" 
android:orientation="vertical"
android:layout_height="fill_parent"
android:background="#EEEEFF"
xmlns:android="http://schemas.android.com/apk/res/android">

<ListView
android:id="@+id/occurences"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</LinearLayout>

私のカスタムリストアイテム:

<com.android.alarm.listItems.AlarmListItem
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" 
android:background="@drawable/alarm_item_background"
android:layout_marginBottom="10dp"    
>
<CheckedTextView     
    android:id="@android:id/text1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:checkMark="?android:attr/listChoiceIndicatorMultiple"
    android:textSize="20sp"
    android:textStyle="bold"
    android:typeface="serif"
    android:padding="10dp"

/>

</com.android.alarm.listItems.AlarmListItem>

この場合、リストアイテムの間隔をどのように設定できますか?

回答:


829

@Asahiは頭に釘を打ちましたが、グーグル経由で後でここに浮かんでいる人のために、XMLを少し追加したかっただけです。

<ListView android:id="@+id/MyListView"
  android:layout_height="match_parent"
  android:layout_width="match_parent"
  android:divider="@android:color/transparent"
  android:dividerHeight="10.0sp"/>

何らかの理由で、「10」、「10.0」、「10sp」などのdividerHeight値はすべて、Androidによって値として拒否されます。浮動小数点数と「10.0sp」などの単位が必要です。@Goofyaheadのメモとして、この値にはディスプレイに依存しないピクセルを使用することもできます(つまり、「10dp」)。


24
仕切りを
伸ばさ

4
FYI-コードで実行できます-getListView()。setDividerHeight(10)
AnhSirk Dasarp 2013

2
またはandroid:divider = "@ null"
kevin '21

@Sojurnそのようなものが必要な場合は、9パッチを試してみました。
スーフィアン2015年

@Sojurn 私の答えを確認しください。それはパディングを追加しますが、ディバイダーを伸ばしません。
スーフィアン2015年


43

Nik Reimanによる解決策は機能しますが、それが自分のやりたいことに最適な解決策ではないことがわかりました。仕切りを使用してマージンを設定すると、仕切りが表示されなくなり、アイテム間の明確な境界を示すために使用できなくなるという問題がありました。また、各アイテムに「クリック可能な領域」が追加されることはないため、アイテムをクリック可能にしたい場合、アイテムが薄いと、仕切りによって追加された高さが高くないため、アイテムをクリックするのが非常に難しくなります。アイテムの一部。

幸いにも、仕切りを表示し、余白ではなくパディングを使用して各項目の高さを調整できる、より良い解決策を見つけました。次に例を示します。

リストビュー

<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>

ListItem

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="10dp"
    android:paddingTop="10dp" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:text="Item"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</RelativeLayout>

実際、より良いソリューションです。ありがとう。
Bigyellowbee

17

ListViewアイテムを(たとえばyour_listview_item)他のレイアウトでラップし、LinearLayoutマージンを追加する必要がありますyour_listview_item

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <your_listview_item
        android:id="@+id/list_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
    ...
    ...
    />
</LinearLayout>

この方法で、必要に応じて、ListViewアイテムの右側と左側にスペースを追加することもできます。


3
左/右マージンが欲しかったので、あなたの答えは役に立ちましたが、マージンの目的でのみ別のレイアウトをラップするという考えは好きではありません
2cupsOfTech

いくつかの方法があります。レイアウトのパフォーマンスの点でそれは悪い方法です。数十(または数百)の項目を含むリストで考えてみてください:)
andrea.rinaldi 2014年

@ andrea.spot数十または数百のアイテムがあるリストでは、一度に画面に表示されるアイテムの数がそれである場合を除いて、問題にはなりません。ListViewはビューのリサイクルを使用します(アダプターを正しく実装した場合)。
ataulm

1
ListViewアイテムに背景がある場合、これは機能しません
vovahost

11

より多くのスペースを追加するが水平線を維持するための私の解決策divider.xmlは、res/drawableフォルダーに追加し、内部に線の形状を定義することでした:

Divider.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line" >

    <stroke
        android:width="1px"
        android:color="@color/nice_blue" />

</shape>

次に、私のリストでは、次のようにディバイダーを参照します。

<ListView
    android:id="@+id/listViewScheduledReminders"
    android:layout_width="match_parent"
    android:layout_height="0dip"
    android:layout_marginBottom="@dimen/mediumMargin"
    android:layout_weight="1"
    android:divider="@drawable/divider"
    android:dividerHeight="16.0dp"
    android:padding="@dimen/smallMargin" >

</ListView>

気づくandroid:dividerHeight="16.0dp"増加し、私は基本的に分周器ラインの上部と下部に多くのパディングを追加していこの高さを減少させることによって。

参照用にこのページを使用しました:http : //developer.android.com/guide/topics/resources/drawable-resource.html#stroke-element


8

マージンのあるディバイダーを引き伸ばさずに表示したい場合-InsetDrawableを使用します(サイズはフォーマットである必要があり、@ Nik Reimanが言ったものです):

リストビュー:

<ListView
    android:id="@+id/listView"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:cacheColorHint="#00000000"
    android:divider="@drawable/separator_line"
    android:dividerHeight="10.0px"/>

@ drawable / separator_line:

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetLeft="5.0px"
    android:insetRight="5.0px"
    android:insetTop="8.0px"
    android:insetBottom="8.0px">

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <gradient
            android:startColor="@color/colorStart"
            android:centerColor="@color/colorCenter"
            android:endColor="@color/colorEnd"
            android:type="linear"
            android:angle="0">
        </gradient>
    </shape>
</inset>

7

以下を使用できます。

android:divider="@null"
android:dividerHeight="3dp"

例:

<ListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView" android:layout_gravity="center_horizontal"
        android:dividerHeight="3dp"
        android:divider="@null" android:clickable="false"/>

nullとリストアイテムのレイアウトを組み合わせると、最高の効果が得られます
Prof

6

私のアプリケーションでは、このようにしています

 <ListView
    android:id="@+id/staff_jobassigned_listview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:divider="@null"
    android:dividerHeight="10dp">

</ListView>

ちょうどset the divider to nullそして仕切りに高さを提供することは私のために行いました。

例:

android:divider="@null"

または

android:divider="@android:color/transparent"

そしてこれは結果です

ここに画像の説明を入力してください


良いと思いますandroid:divider="@android:color/transparent"
CoolMind 2016

5

すでに回答が選択されていることに気づきましたが、この問題に遭遇したときに何がうまくいったかを共有したいと思います。

私はリストビューを持っていて、リストビューの各エントリは、サミーが質問に投稿したものと同様に、独自のレイアウトによって定義されていました。私は仕切りの高さを変更するという提案されたアプローチを試しましたが、目に見えない仕切りがあったとしても、見栄えが良くなりすぎませんでした。いくつかの実験を行った後、android:paddingBottom="5dip"個々のlistViewエントリを定義するXMLファイルの最後のTextViewレイアウト要素にを追加しました。

これにより、を使用して達成しようとしていたことが正確にわかりましたandroid:layout_marginBottom。私はこの解決策が、仕切りの高さを増やすよりも審美的に満足のいく結果を生み出すことを発見しました。


4

マージンを与える代わりに、パディングを与える必要があります:

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:divider="@android:color/green"
    android:dividerHeight="4dp"
    android:layout_alignParentTop="true"
    android:padding="5dp" >

</ListView>

または

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:paddingTop="2dp"
    android:divider="@android:color/green"
    android:dividerHeight="4dp"
    android:paddingLeft="1dp"
    android:paddingRight="1dp"
    android:paddingBottom="2dp"
    android:paddingStart="0dp"
    android:paddingEnd="0dp" >

</ListView>

3

OPの既存のコード(リストアイテムは既にパディングされている)を使用した最も簡単なソリューションは、次のコードを追加することです。

listView.setDivider(new ColorDrawable(Color.TRANSPARENT));  //hide the divider
listView.setClipToPadding(false);   // list items won't clip, so padding stays

この SOの答えは私を助けました。

注:ここで質問されているように、古いプラットフォームではリストアイテムのリサイクルのバグが早すぎる可能性があります


1
あなたはdividerをnullに、dividerHeightを好きなように設定できます。
Andrew Gallasch

1
@Andyアイテム間のパディングも削除すると思います。... OPが解決したい問題を作成される
Sufian

2
<ListView
    android:clipToPadding="false"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:dividerHeight="10dp"
    android:divider="@null"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</ListView>

すべての要素間の等間隔とリストの上部と下部のスペースを取得するにはpaddingToppaddingBottomdividerHeightを同じ値に設定します。

このパッド領域にビューを描画できるように設定clipToPaddingfalseました。

リスト要素間の行を削除dividerする@nullように設定しました。


2

また、リストアイテム間の間隔を広げるもう1つの方法は、layout_height属性に必要な間隔を指定して、空のビューをアダプターコードに追加することです。たとえば、リストアイテム間の下部の間隔を広げるには、このダミービュー(空のビュー)をリストアイテムの最後に追加します。

<View
    android:layout_width="match_parent"
    android:layout_height="15dp"/>

したがって、これにより、リストビューアイテム間に15 dpの下のスペースができます。親レイアウトがLinearLayoutで方向が垂直の場合、これを直接追加するか、他のレイアウトに適切な手順を実行できます。お役に立てれば :-)


2

リストの仕切りの背景を透明にし、必要なギャップに応じて高さを設定するだけです。

<ListView 
         android:id="@+id/custom_list"
         android:layout_height="match_parent"
         android:layout_width="match_parent"
         android:divider="#00ffffff"
         android:dividerHeight="20dp"/>

1

Horizo​​ntalListViewを使用している場合は、仕切りが動作しないようですので、あまり良くない解決策を見つけましたが、より一般的なListViewではどちらの方法でも機能すると思います。

追加するだけ:

<View
android:layout_marginBottom="xx dp/sp"/>

アダプタクラスで膨張させるレイアウトの最下部のビューでは、アイテム間にスペースが作成されます


1

listView内のビュー間に間隔を空けるには、インフレートビューでパディングを使用してください。

android:paddingBottom="(number)dp"&& android:paddingTop="(number)dp"は、リストビュー内のインフレートしているビューで使用できます。

いつの日か、仕切りの色(現在は透明)を使用したいときに、仕切りの線が引き伸ばされていることがわかるので、仕切りのソリューションは単なる修正です。


1

これらのソリューションの多くは機能します。ただし、アイテム間のマージンを設定できるようにしたい場合、私が思いついた最も簡単な方法は、アイテムをラップすることです。ルートレイアウトではありません。このラッピングレイアウトにIDを指定し、アダプターのCheckedTextViewとともに作成してください。

それでおしまい。実際には、ListViewの項目レベルでマージンをインスタンス化しています。ListViewはアイテムレイアウトを認識しないため、アダプタのみが認識します。これは基本的に、以前は無視されていたアイテムレイアウトの部分を膨らませます。


0

これは、仕切りの高さを追加するのに役立ちます。

 getListView().setDividerHeight(10)

カスタムビューを追加する場合は、listViewアイテムレイアウト自体に小さなビューを追加できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.