RealmListのaddChangeListenerの仕組み

英語が読めない上にあんまり情報がなくて詰まっていたので自分用メモ。

realmList.addChangeListener { newRealmList, changeSet -> 
} 

みたいにするとchangeSetで挿入と削除した要素番号がとれる。
挿入の場合はchangeSet.insertions
削除の場合は changeSet.deletions
という配列に入っている。

if (changeSet.insertions.isNotEmpty) {
なんかする
} 

みたいにして処理をする。

ここまではいいんですが、RealmListにはmove(int oldPos, int newPos)というメソッドが用意されていて、要素の入れ替えができる。
これをListener側でどう処理するかというと、insertiondeletion両方の配列に値が詰め込まれることになる。
changeSet.changes()というメソッドは呼ばれない。 配列の1番目の要素を2番目に移動させる場合、
changeSet.insertions.first() には0 が入り、changeSet.deletions.first() には 1 が入る。 ちょっと体感的にわかりづらい気がするけど、こういう感じで処理をする。

if (changeSet.insertions.isNotEmpty() && changeSet.deletions.isNotEmpty() ) {
//なんかする
}

みたいな感じになる。