TabLayoutとAsyncTaskLoaderを併用するときの注意点

TabLayout を使うために Fragment と AsyncTaskLoader を使っていましたが,onLoadFinished() が実行されるタイミングを見てみると,タブを切り替えるたびに Loader クラスを呼んでることがわかりました.

Loader に関連する仕様が原因かと思いきや,TabLayout のほうで調整できるようになってました.

解決したかったこと

タブを切り替えると,隣のタブは前回の View が保存されているのに対し,二つ隣のタブを表示したときに Loader が呼ばれてしまいます.

原因

TabLayout は ViewPager と共に使っていましたが,この ViewPager には setOffscreenPageLimit() というメソッドが実装されており,描画されていない画面をいくつキャッシュしておくか決めることができるようになっていました.

デフォルトでは setOffscreenPageLimit(1) になっており,これが隣のタブの View が保存されていた理由です.

解決方法

タブは全部で三つなので,二つ隣のタブまでキャッシュできていればどれだけタブを移動しても Loader を再度呼ぶことはありません.

private ViewPager mViewPager;

...

@Override
public void onCreate( ... ) {
    ...

    mViewPager = findViewById(R.id.view_pager);
    mViewPager.setOffscreenPageLimit(2);
}

最後に

Loader ばかり見ていて解決にやたら時間かかってしまいました.

参考