くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

AndroidのListViewで先頭に要素を自然に追加する

ツイッターみたいに、上方向の自動読み込みを実装したいなと思い、
ListViewの先頭に追加しても、スムーズにスクロールできる方法を、いろいろ調べたときの備忘録。

ほぼこの記事のまま、すごい。。
以下は、コメントとかを追加したくらい

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

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

adapter.notifyDataSetChanged();

// 追加した要素分したに移動して、要素追加前の状態になるようセットする
listview.setSelectionFromTop(pos + addItemSize, top);

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

ポイント・気をつけること

  • setSelection系の前に、notifyDataSetChangedをしないといけない
    • ListViewがデータが変わったことを通知しないと、setSelection系が意図通り動かない
  • setSelectionではなく、setSelectionFromTopをつかう
    • setSelectionだと要素の先頭じゃないときに、カクっとなってしまう

他に試したこと

  • android:transcriptMode="disabled"は、効果がなかった
  • setNotifyOnChange(false)/setNotifyOnChange(true)とかを使ったけど、効果なかった

参考にしたサイト様