ツイッターみたいに、上方向の自動読み込みを実装したいなと思い、
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
系が意図通り動かない
- ListViewがデータが変わったことを通知しないと、
setSelection
ではなく、setSelectionFromTop
をつかうsetSelection
だと要素の先頭じゃないときに、カクっとなってしまう
他に試したこと
android:transcriptMode="disabled"
は、効果がなかったsetNotifyOnChange(false)/setNotifyOnChange(true)
とかを使ったけど、効果なかった