ListView(CardView)の最後の要素にだけマージンをつけたい場合がある。
意外とぐぐってもあまり出てこなかったので、自分なりの方法を書いておく。
(他に良い方法があればコメント頂けるとうれしいです!)
例えば上のスクリーンショットのように、ListViewの最後の要素が画面下にピタッとくっついてしまって、気持ち悪い場合がある。xmlで<ListView>
自体にマージンを入れるという方法もあるが、それだとListView全体に対してマージンがついてしまい、リストが途中で途切れてるような格好になってしまい、あまり良くない。
というわけなので、以下のスクリーンショットのように
ListViewの最後の要素にだけ、Bottomにマージンをつけてあげる。
コードはいたって簡単。
ListAdapter
private List<ListItem> list;
protected class ListAdapter extends ArrayAdapter<ListItem> {
...
public View getView(int position, View convertView, ViewGroup parent) {
...
CardView cardView = (CardView) convertView.findViewById(R.id.cardView);
int lastLine = list.size() - 1;
if (position == listSize) {
ViewGroup.LayoutParams lp = cardView.getLayoutParams();
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) lp;
mlp.setMargins(mlp.leftMargin, mlp.topMargin, mlp.rightMargin, 32);
cardView.setLayoutParams(mlp);
}
...
}
}
以下のように、リストの最後の要素だけを処理してあげる。
int lastLine = list.size() - 1; // positionは0からはじまるので1を引く
if (position == lastLine) {
// TODO
}
動的にマージンをつけるには、MarginLayoutParams
をつかう。いったんLayoutParams
を取得してから、MarginLayoutParams
にキャストするのがポイント。
ViewGroup.LayoutParams lp = cardView.getLayoutParams();
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) lp;
// left, top, rightはそのままでbottomにだけマージンをつける(単位はdp)
mlp.setMargins(mlp.leftMargin, mlp.topMargin, mlp.rightMargin, 32);
cardView.setLayoutParams(mlp);
おわり