onViewDetachedFromWindow()

RecyclerView.AdapteronViewDetachedFromWindow()メソッドは、リスト要素がスクロールで画面外へ出ると呼ばれる。

アニメーションの停止や、タイマーのキャンセルなど、要素が非表示になったタイミングでリソースを解放したい場合に利用できる。

使い方

RecyclerView.Adapterを継承したクラスでonViewDetachedFromWindow()をオーバーライドする。

class SampleAdapter : RecyclerView.Adapter<SampleAdapter.ViewHolder>() {

    class ViewHolder(val binding: ItemSampleBinding) : RecyclerView.ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding = ItemSampleBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.binding.animationView.playAnimation()
    }

    override fun onViewDetachedFromWindow(holder: ViewHolder) {
        super.onViewDetachedFromWindow(holder)
        holder.binding.animationView.cancelAnimation()
    }

    override fun getItemCount() = 10
}

上記の例では、onBindViewHolder()でアニメーションを再生し、onViewDetachedFromWindow()でアニメーションをキャンセルしている。

onViewRecycled()との違い

RecyclerView.AdapterにはonViewRecycled()というメソッドもあり、ViewHolderが再利用されるときに呼ばれる。

メソッド呼ばれるタイミング
onViewDetachedFromWindow()ViewHolderが画面外に出たとき
onViewRecycled()ViewHolderが再利用プールに戻されるとき

スクロールによって要素が隠れてすぐに処理したい場合はonViewDetachedFromWindow()、再利用直前に処理したい場合はonViewRecycled()を使う。

参考