Androidの上部のリストビュー項目の上(および最後の項目の下)にマージンを追加します


147

これは、AndroidのListView内のアイテムのレイアウトに関するかなり細かい質問です。

上部にタイトルバーがあり、ListViewが画面の残りの部分を占めるアクティビティがあります。ListViewを左、右、上に10 dpのパディングで表示したいのですが、ListViewを上にスクロールすると、フェードエッジの下で消える前に、上部の10 dpのパディングを覆います。同様に、一番下までスクロールすると、最後のリストアイテムは、最後のリストアイテムの一番下と実際の画面の一番下の間に10 dpで表示されます(理由がわからない場合は、かなりの背景画像が欲しいからです) ListViewの周りを突っついて)。

ListView自体にパディングを追加しようとしましたが、リストをスクロールすると、パディングの端の下に表示されなくなります。

私はウェブ開発の出身です。最初のリストアイテムの上(および最後のリストアイテムの下)にマージンを追加することになります。


左と右の余白だけを指定してください...ここにxmlを貼り付けてみてください。問題の編集が表示されます。お待ちください、つまり...上下のパディングもスクロールしますか?
Tek Yin

左マージンと右マージンを指定できません。Androidレイアウトには「マージン」はなく、パディングのみです。しかし、はい、上と下のパディングをスクロールさせたいのですが、それはそれを説明する良い方法です。
Mick Byrne

私はすでにいくつかの方法を試しましたが、それでも失敗しました..いくつかのトリックがありますが、それを行うのはより難しくなります... 2つのカスタムオブジェクトをリストアイテムの最初と最後の位置に配置し、カスタムアダプターを使用してアイテムを検出して別の方法で描画します(高さを低くして透明)
Tek Yin

ええと...それは私がフォールバックすることも考えていたものです。しかし、ビューではなく、リストアイテムの背景色を設定する必要があるため、これにはさまざまな複雑さが伴います。つまり、何かをタップしたときに表示するために、手動で何らかのハッキングを行う必要があります。 。とにかくあなたの助けをありがとう...
Mick Byrne

グッドニュース..私は解決策を持って...あなたはListActivityにaddHeaderView(ビューV)を使用することができます。..ちょうど呼び出す getListView(). addHeaderView(capView)getListView(). addHeaderView(botView) 必ずそれが前のリストなどの内容を初期化すると呼ば作ります。setListAdapter(adapter);
Tek Yin

回答:


397

あなたが書いた:

ListView自体にパディングを追加しようとしましたが、リストをスクロールすると、パディングの端の下に表示されなくなります。

ListView's clipToPadding属性をに設定しますfalse。これは、周りのパディング可能であろうListView レイアウト(だけでなくパディングのエッジまで)の終わりまでスクロールします。

例:

<ListView
    android:id="@+id/list_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:divider="@android:color/transparent"
    android:dividerHeight="10.0sp"
    android:padding="16dip"
    android:clipToPadding="false"/>

android:clipToPaddingは、ViewGroupレイアウトおよびビューコンテナの基本クラスのXML属性です。

関連するメソッド呼び出しは次のとおりです。

public void setClipToPadding (boolean clipToPadding)

4
さらに、これを使用してスタイルまたはテーマにすることができます<item name="android:clipToPadding">false</item>
pjco

2
ああ、これはScrollViewにも当てはまります
pjco 2013年

4
少し議論に遅れましたが、古いデバイス(一部の2.3.xデバイスで見つけました)では、リストアイテムビューのリサイクルが早すぎることに注意してください。描画フェーズはそこに描画できることを認識していますが、レイアウトフェーズはそうではないため、アイテムはすでに画面外にあると見なされます。stackoverflow.com/questions/15915226/…を参照してください。
Jeffrey Klardie、2014年

@JeffreyKlardie古いデバイスでアイテムのリサイクルが早すぎるという問題に遭遇し、スクロールバー自体がその場でサイズ変更されてしまい、本当に奇妙に見えます。@pjco理由はわかりclipToPaddingませんが、スタイルを介した設定が機能しません。適用されないようなものです。ただし、ListViewに直接設定すると機能します。
ForceMagic 2014

5
android:scrollbarStyle="outsideOverlay"スクロールバーもパディングを通り抜けるように、忘れないでください
jfcartier '18年

19
View padding = new View(this);
padding.setHeight(20); // Can only specify in pixels unfortunately. No DIP :-(

ListView myListView = (ListView) findViewById(R.id.my_list_view);

myListView.addHeaderView(padding);
myListView.addFooterView(padding);

myListView.setAdapter(myAdapter);

上記のListViewには、20ピクセルのヘッダーとフッターのパディングがあります。


4
答えてくれてありがとう!よく働く!!あなたはDPで高さを入れたい場合には、DisplayMetricsを使用して行うことができます: float mDensity = getResources().getDisplayMetrics().density; int height = (int) (50 * mDensity + 0.5f); padding.setHeight(height);
トニーCeralva

3
あるいは、getResources()。getDimensionPixelOffset(R.dimen.some_value);を使用して、Javaレベルでdpの次元を取得します。
greg7gkb 2012年

1
私がStackOverflowで学んだAndroidの内容が開発者サイトで学んだAndroidの内容に対して本当に驚いた
TrueCoke

1
またはそれ以上(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());
Eugen Pechanec 14

1
API 23のViewには「setHeight()」メソッドはありません。代わりに「setMinimumHeight()」を使用できます。
KWA 2016

10

@Jakobudの答えへの付録...

私のリストビューはすでにandroid:divider/android:dividerHeightプロパティを使用して、リストビュー項目間に透明なギャップを作成していました。これにより、android:headerDividersEnabledおよびandroid:footerDividersEnabledプロパティを追加し、ヘッダービューとフッタービューをに設定するだけで済みましたnew View(Activity.this)

listViewに仕切りが既に設定されている場合の単純化。


1
アイテムのマージンやパディングではなく、可能な場合は仕切りを使用できる人ならだれにでも助言します。すばらしい回答
dzsonni 2013年

2

ListFragment@Jakobudおよび@ greg7gkbによるソリューションに基づいた、を使用した私のソリューション。

ListView listView = getListView();
listView.setDivider(null);
listView.setDividerHeight(getResources().getDimensionPixelSize(R.dimen.divider_height));
listView.setHeaderDividersEnabled(true);
listView.setFooterDividersEnabled(true);
View padding = new View(getActivity());
listView.addHeaderView(padding);
listView.addFooterView(padding);

1

@Gunnar Karlssonの答えは良いですが、完全にパディングの後ろにあるが、まだ完全に画面から外れていないと、セルビューが早期にリサイクルされるという問題があります。これは、clipToPadding = falseの設定が原因であり、Androidの将来のバージョンで修正される場合と修正されない場合があります(ListViewでclipToPaddingを使用すると、アイテムが早期にリサイクルされます)。

私は副作用のない素晴らしいシンプルな解決策があります:

  1. cell_design.xmlに外部(線形または相対)レイアウトを追加する
  2. この外側のレイアウトにパディング(つまり、10dip)を追加して、セル全体の周囲に「マージン」を作成します。(注意:パディングのみが機能し、外側のレイアウトのマージンは機能しません)
  3. ListViewセットandroid:dividerHeight="-10dip"で、セルの周りにあるものの反対

他の回答と比較して、仕切りの色を設定する必要はありません。一番上のセルと一番下のセルのパディングが存在し、負の仕切りはその間の2倍の高さの仕切りを防ぎます。


「副作用なし」は完全に真実ではありません。ビュー階層、特にリストビューアイテムに別のレイヤーを追加すると、パフォーマンスが低下します。
Teovald、2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.