note63

事情

ListViewの挙動をいい感じにした

ListViewをいい感じにしたのでメモ。
ここでいういい感じとは以下の様な仕様のこと

  • リストビューが一番トップにスクロールされている場合、新しい要素がスクロールしながら追加される
  • 一番トップにない場合はアニメーションしない、かつリストがずれない

これを実現するには以下のように実装すればいい

// 要素を一番上に追加
adapter.insert("added item", 0);

// 画面上で最上部に表示されているビューのポジションとTopを記録しておく
int pos = listview.getFirstVisiblePosition();
int top = listview.getChildAt(0).getTop();

adapter.notifyDataSetChanged();

// 要素追加前の状態になるようセットする
listview.setSelectionFromTop(pos + 1, top);

// リストのトップにスクロールされている場合は新しい要素のところまでスクロールする
if (pos == 0 && top == 0) {
    listview.smoothScrollToPositionFromTop(pos, 0);
}

setSelectionって名前的にどう考えても選択系なんだけどこういう挙動なんですね。
完全に勘違いしてたのでこれを実装するのにかなり時間を使いましたorz

参考