Android ListView Divider


97

私はこのコードを持っています:

<ListView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList"
     android:cacheColorHint="#00000000"
     android:divider="@drawable/list_divider"></ListView>

ここ@drawable/list_dividerで:

<shape
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="line">
 <stroke
   android:width="1dp"
   android:color="#8F8F8F"
   android:dashWidth="1dp"
   android:dashGap="1dp" />
</shape>

仕切りが見えません。


1
理由はわかりませんが、コードがありません。ここに再びそれがあります:
oriharel

<ListView android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:id = "@ + id / cashItemsList" android:cacheColorHint = "#00000000" android:divider = "@ drawable / list_divider"> </ ListView>
oriharel

1
リスト区切りは次のとおりです:<shape xmlns:android = " schemas.android.com/apk/res/android " android:shape = "line"> <stroke android:width = "1dp" android:color = "#8F8F8F" android:dashWidth = "1dp" android:dashGap = "1dp" /> </ shape>
oriharel

コード、特にXML / HTML / SGMLコードの挿入には、コードブロック(101010アイコン)を使用します。今のところあなたの投稿を修正しました。
Lie Ryan

多分あなたの問題の理由はあなたのListAdapterにあります。アダプタのareAllItemsEnabled()のtrueを返してみてください。または、stackoverflow.com
questions / 5587826 /…をご覧ください

回答:


175

皆さん、1dpまたは1dipの代わりに1pxを使用する必要がある理由は次のとおりです。1dpまたは1dipを指定すると、Androidはそれを縮小します。120dpiデバイスでは、0.75pxに変換され、0に丸められます。一部のデバイスでは、2〜3ピクセルに変換され、通常、醜いか、ずさんなように見えます

仕切りの場合、1ピクセルの仕切りが必要な場合は1pxが適切な高さであり、「すべてをディップにする」ルールの例外の1つです。すべての画面で1ピクセルになります。さらに、1pxは通常、hdpi以上の画面でよりよく見えます

「2012年ではなくなりました」編集:特定の画面密度から開始してdp / dipに切り替える必要がある場合があります


4
ワオ。私を助けた。「ディップ」を使用するには、Androidの公式ガイドの一部である必要があります
deeJ

同意する。彼らは、なぜpxに関するルールを、なぜ持っているかの例として言及する必要があります。
Joe Plante

6
ldpiでは、1dp = 0.75ピクセルであるため、0に切り捨てられます。この場合、ディバイダーは描画されず、他のユーザーに問題が発生する可能性があります。これは、このスレッドの他のステートメントも参照しており、pxを完全に使用することに不満を持っています。これが彼の問題の解決策かもしれないし、そうでないかもしれません。それがそうであるかどうかを宣言するのは彼次第です
Joe Plante

18
xxhdpiデバイスでは1pxは信じられないほど小さくなり、ある時点(デバイスの密度が高くなるにつれて)は小さすぎてまったく見えなくなります。Dipはこれを回避します。ldpiデバイスの別のソリューションは、values-ldpiフォルダーで1pxを使用し、より高密度の1dipを使用することです。
eski 2014

2
その回答を投稿したところ、xxhdpiが出てきたばかりだと思います。しかし、あなたの投稿は、特にxxxhdpiとおそらくxxxxhdpiが地平線上にある場合に意味があります
Joe Plante

54

これは回避策ですが、私にとってはうまくいきます:

以下のようにres / drawable / divider.xmlを作成しました。

<?xml version="1.0" encoding="UTF-8"?>
<shape
  xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient android:startColor="#ffcdcdcd" android:endColor="#ffcdcdcd" android:angle="270.0" />
</shape>

そして、listviewアイテムのstyles.xmlに、次の行を追加しました。

    <item name="android:divider">@drawable/divider</item>
    <item name="android:dividerHeight">1px</item>

重要な部分は、この1px設定を含めることでした。もちろん、ドローアブルはグラデーション(1px)を使用しており、それは最適なソリューションではありません。ストロークを使ってみましたが、うまくいきませんでした。(スタイルを使用していないようなので、ListViewにandroid:dividerHeight = "1px"属性を追加するだけです。


14
または、ベストプラクティスの1dpを使用します。
Tristan Warner-Smith

2
なぜ270度の角度を使用するのですか?リストの仕切りは水平線です。270は垂直方向のグラデーションです。
クリストファーペリー

これはAndroidのバグではありませんか?仕切りが機能するので、ラインシェイプは使えませんか?
Diederik

8
1pxアセットはルールの例外です
Joe Plante

1
@ TristanWarner-Smithこれは間違いです。この場合、1pxを使用する必要があります。受け入れられた答えを見てください。
mpellegr 2014年

26

追加android:dividerHeight="1px"すると動作します:

<ListView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList"
     android:cacheColorHint="#00000000"
     android:divider="@drawable/list_divider" android:dividerHeight="1px"></ListView>

15

発生している問題は、必要なandroid:dividerHeightが欠落しているという事実、および一部の仕切りでは実行できない、ドローアブルで線の太さを指定しようとしているという事実に起因しています。奇妙な理由。基本的に、サンプルを機能させるには、次のようにします。

ドローアブルを長方形または線のいずれかとして作成します。どちらも機能するため、寸法を設定することはできません。

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line">
     <stroke android:color="#8F8F8F" android:dashWidth="1dp" android:dashGap="1dp" />
</shape>

または:

<shape xmlns:android="http://schemas.android.com/apk/res/android"  android:shape="rectangle">
     <solid android:color="#8F8F8F"/>
</shape>

次に、カスタムスタイルを作成します(単なる設定ですが、再利用できるようにしたい)。

<style name="dividedListStyle" parent="@android:style/Widget.ListView">
    <item name="android:cacheColorHint">@android:color/transparent</item>
    <item name="android:divider">@drawable/list_divider</item>
    <item name="android:dividerHeight">1dp</item>
</style>

最後に、カスタムスタイルを使用してリストビューを宣言します。

<ListView
     style="@style/dividedListStyle"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:id="@+id/cashItemsList">
</ListView>

知らない場合でも、これらのスニペットの使い方を知っていると思います。基本的にあなたの質問への答えは、ドローアブルでディバイダーの厚さを設定できないことです。そこで、幅を未定義のままにし、代わりにandroid:dividerHeightを使用する必要があります。


8

ドキュメントから:

public void setDivider(Drawable divider) on ListView

/**
 * Sets the drawable that will be drawn between each item in the list. If the drawable does
 * not have an intrinsic height, you should also call {@link #setDividerHeight(int)}
 *
 * @param divider The drawable to use.
 */

setDividerHeight()本来の高さがない場合にディバイダーを表示するために呼び出す必要があるように見えます


5

次の@drawable/list_divideようになります。

<shape
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="line">
 <stroke
   android:height="1dp"
   android:color="#8F8F8F"
   android:dashWidth="1dp"
   android:dashGap="1dp" />
</shape>

あなたのバージョンではを提供しandroid:width="1dp"、それをに変更するだけandroid:height="1dp"で動作します!


5
android:heightはストロークの有効な属性ではありません。幅は、ストロークの長さではなく、ストロークの幅を意味します。「ソリューション」が機能する唯一の理由は、Androidがその高さの値を認識しないためです。
Justin Buser、2012

4

ドキュメントから:

ファイルの場所:

res / drawable / filename.xml

ファイル名はリソースIDとして使用されています

基本的に、あなたはという名前のファイルに置く必要がありますlist_divider.xmlres/drawable/あなたのようにそれにアクセスできるようにしますR.drawable.list_divider。その方法でアクセスできる場合android:divider="@drawable/list_divider"は、XML forで使用できますListView


私はeclipseを使用しているので、それを行わなかった場合、コードはコンパイルされません。そのため、ファイルを配置しても、リストビューは私のカスタムディバイダーを無視しているように見えます。
oriharel

2

一部の人々は実線を経験しているかもしれません。android:layerType="software"ドローアブルを参照するビューに追加することでこれを回避しました。


1

android docsは、丸めエラーが原因で消えることについて警告します...おそらく、pxの代わりにdpを試し、おそらく> 1を最初に試し、丸めの問題かどうかを確認します。

http://developer.android.com/guide/practices/screens_support.html#testingを参照してください

「高さ/幅が1ピクセルの画像」セクション


うん。2つ以上のdp / dipを使用している場合は、問題ありません。ただし、1ピクセルの仕切りだけが必要な場合は、pxが適しています。また、1ピクセルでより多くの画面不動産を取得できます。さらに、1ピクセルのほうが通常は見栄えがよい
Joe Plante

1

同じ問題がありました。ただし、ビューを1pxにしても、元のNexus 7では機能しなかったようです。画面密度が213であり、xhdpiで使用されている240よりも低いことに気付きました。そのため、デバイスはmdpi密度であると考えていました。

私の解決策は、dimensフォルダーにdividerHeightパラメーターを設定することです。私はそれをフォルダーに設定し2dpましたvalues-mdpi1dpvalues-hdpietcフォルダーに設定し ました。


1

あなたはあなたのディバイダーXMLレイアウトのディバイダーの終わりに「r」を忘れました

レイアウトを@ drawable / list_dividerと呼びますが、ディバイダーxmlの名前は「list_divide」です。


-1

android:dividerHeight = "1dp"を設定します

<ListView
            android:id="@+id/myphnview"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@drawable/dividerheight"
            android:background="#E9EAEC"
            android:clickable="true"
    android:divider="@color/white"
                android:dividerHeight="1dp"
                android:headerDividersEnabled="true" >
    </ListView>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.