【Android】RecyclerViewの移動アニメーションをオフにする方法


RecyclerViewにはデフォルトでアニメーションが設定されており、アイテムの順番が変わった時などに移動アニメーションが行われるかと思います。

アニメーションがあると切り替わりが視覚的にわかるので便利である一方、アニメーションをなくしたいなと思う場面もあるかと思います。

そこで今回は、RecyclerViewの移動アニメーションをオフにする方法を2つほどご紹介したいと思います。

※ 移動アニメーションは↓の並び替え時のアニメーションを指しています。

①. itemAnimatornull をセットする方法

一番手っ取り早い方法です。
そもそもRecyclerViewにはデフォルトで itemAnimatorDefaultItemAnimator というのがセットされており、それがアニメーションを提供しています。
なので itemAnimatornull をセットし DefaultItemAnimator を使わないようにすることでアニメーションをオフにする形です。

val recyclerView = ...
recyclerView.itemAnimator = null // nullをセット

このようにすると、アイテムの順番が変わった際にアニメーションが走らず、パッと切り替わるようになります。

②. DefaultItemAnimator を使いつつ、移動アニメーションだけオフにする方法

①の方法が手っ取り早く楽なのですが、 DefaultItemAnimator には移動アニメーション以外にも、アイテムを表示する際のアルファのアニメーションもあったりするので、全部をオフにするとアイテム表示時にやや唐突な印象を与えてしまうかもしれません。

そこで、DefaultItemAnimator は使いつつ、移動アニメーションだけをオフにしてみます。

DefaultItemAnimator の無名クラスを itemAnimator にセットし、 animateMove というのをオーバーライドしてあげます。

val recyclerView = ...
recyclerView.itemAnimator = object : DefaultItemAnimator() {
    override fun animateMove(holder: RecyclerView.ViewHolder?, fromX: Int, fromY: Int, toX: Int, toY: Int): Boolean {
        dispatchMoveFinished(holder) // これは呼んだほうがいいらしい
        return false // falseで返すことで後続の処理を呼ばないように指定
    }
}

このようにすると、移動アニメーションに関しては①と変わらずですが、RecyclerViewにアイテムが最初に表示される時にアルファのアニメーションが走るようになります。(gifが若干わかりにくいですが…)

①の時 ②の時

以上、RecyclerViewの移動アニメーションをオフにする方法を2つご紹介しました。
他のやり方・もっといいやり方などご存じの方がいらっしゃいましたら、コメントなどいただけると嬉しいです。