web-dev-qa-db-ja.com

リストビューの最後の要素に下マージンを追加

複雑なアイテムの背景を持つListViewを追加する必要があります:偶数/奇数、および上部と下部の丸いコーナーで異なります。次のようになります。

ListView top

Level-listを介してこれらすべてを実装しましたが、もう1つやりたいことがあります。これで、下部のアイテムは画面の下部近くにあります。スペースを追加することをお勧めします。

ListView bottom looks not good

ListViewに下マージンを追加したくありません。最後のアイテムにのみマージンが必要です。

私がこれを行う方法:

フッター

ハッキングの一種–空のTextViewを含むフッターをListViewに追加します。しかし、フッターは非常に不安定なものであり、通常notifyDataSetChangedの後に消え、それらを戻す方法はありません。

透明ピクセルを含む画像

透明なピクセルを下の背景リソースに追加するようデザイナーに依頼しました。残念ながら、この場合、垂直方向のセンタリングは完全に壊れています。たとえば、次のような9patchがあります。

9patch

そして、このようなレイアウト:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
             Android:layout_width="match_parent"
             Android:layout_height="match_parent"
        >
    <!-- View with background with transparent pixels on bottom -->
    <LinearLayout Android:layout_width="match_parent" Android:layout_height="wrap_content"
                  Android:id="@+id/item"
                  Android:background="@drawable/some_bgr"
                  Android:padding="10dp"
            >
        <TextView Android:layout_width="0dp" Android:layout_height="wrap_content" Android:layout_weight="1"
                  Android:text="Title"
                  Android:layout_gravity="center"
                  Android:textSize="18sp"
                />
        <TextView Android:layout_width="wrap_content" Android:layout_height="wrap_content"
                  Android:text="Detail"
                  Android:layout_gravity="center"
                  Android:textSize="18sp"
                />
    </LinearLayout>

    <!-- Just for marking place took by view -->
    <FrameLayout Android:layout_width="match_parent" Android:layout_height="match_parent"
                 Android:layout_below="@id/item"
                 Android:background="#88ff55"
            />
</RelativeLayout>

結果:

Result

ご覧のとおり、センタリングは機能していません。残念ながら。 (ところで、この9patchをTextViewの背景として指定すると、センタリングがうまく機能します。これを説明する記事を知っているなら、私に知らせてください。)

アダプタ実装の最後のアイテムに下マージンを追加します

それは動作するはずですが、理由は不明ですが、まだ動作しません。コードの次元を変更するのは好きではないので、この方法は好きではありません。

そう

想像上の方法がすでにあります。特定のビットマップとマージンを使用して、いくつかのXMLドローアブルを構築します。ドロウアブルのコンセプトによれば、それは可能であるべきですが、私は実装を見つけることができません。誰かが知っているかもしれませんか?

他のアイデアはありますか?

71
darja

ListViewで、paddingBottomclipToPadding="false"を設定します。

  <ListView
      Android:layout_width="match_parent"
      Android:layout_height="match_parent"
      Android:paddingBottom="8dp"
      Android:clipToPadding="false"
      Android:scrollbarStyle="outsideOverlay"/>
  • これはRecyclerViewでも機能します。

  • スクロールバーが埋め込み領域にオーバーフローしないようにする場合にのみ、Android:scrollbarStyle="outsideOverlay"を使用します。

257
clocksmith

次のようにリストに空のフッターを追加します。

TextView empty = new TextView(this);
empty.setHeight(150);
listview.addFooterView(empty);
7
fullMoon

必要に応じて、コードからそれを行うこともできます。たとえば、ここでは、EditTextのさまざまな状況に対応します。

   if(s.toString().length()>0)
   {
      contacts_lv.setClipToPadding(false);
      contacts_lv.setPadding(0,0,0,270*screenDensity);
   }
   else
   {
      contacts_lv.setClipToPadding(true);
      contacts_lv.setPadding(0,0,0,0);
   }
3
Gal Rom

Clocksmithの答えは最高で、とても賢いです。空のフッタービューを作成することもできます。

2
SIr Codealot

別の解決策は、特定の高さでモックビューを作成することです。

アダプターのgetViewCountで2を返します。

GetCountにyourData.size + 1を返します。

GetViewTypeで、要素が最後の要素かどうかを確認し、2を返します。

GetViewでこのタイプを使用して、モックビューを作成します。

0
minimalist

ListView XMLコードに次の2行を追加します。

Android:transcriptMode="alwaysScroll"  
Android:stackFromBottom="true"
0
Rohit Kumar