らこらこブログ

唐揚げとアニメとプログラミングが大好きです

今日のAndroid(愚痴)~FragmentStatePagerAdapter~

ViewPagerを使うときに使用するFragmentStatePagerAdapterが、終端のページをremoveすることしか考えてなくて中間のページを削除するとめちゃくちゃにバグるんですねこれ

[Fragment 0][Fragment 1][Fragment 2]
とある状態で
Fragment 1をremoveすると
[Fragment 0][Fragment 2]
になって、一見できてるみたいに見えるけど
この状態でFragment 3を追加すると
[Fragment 0][Fragment 2][ ]
と、Viewが空っぽのページになったり(その後3番目のページはずっとこうなる)
Fragment 1を削除するとなぜか
[Fragment 1][Fragment 2]
になったり。


ViewPagerが内部でページのデータを保持している?っぽい?から?消しても?残ってて?そこに追加できないけど?そこにあるFragmentはdestroyされてるから?もうonCreateView呼ばれなくて?空っぽ?んなわけあるかいな


なんかもうわけわかんなくてわけわかんないです Androidなんて無くなればいいのに

[追記]
下の感じで回避出来ました

int current = pager.getCurrentItem();
adapter.remove(current);
List<MyFragment> list = new ArrayList<MyFragment>();
list.addAll(adapter.getList());
adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), list); 
pager.setAdapter(adapter);

つまるところ、
・Adapterからリスト(or配列)を引き出せるようにしておく
・リストから要素を削除して、notifyDataSetChangedしないでその状態のリストをコピー
・Adapterのインスタンスをnewして新しいAdapterにコピーしたリストを与える
・ViewPagerにAdapterをsetしなおす

という流れ。
どうやらFragmentStatePaerAdapterにしてもFragmentPagerAdapterにしても内部でなんかキャッシュ作ってるらしくて、それが影響していろいろな不都合が生じてるらしいので、必要な情報だけコピーした新しいAdapterをPagerに充てることで解決です。

この形式であれば自分で実装したMyFragmentPagerAdapterにcloneメソッドでも定義しておくと便利かもしれないなあとも思った。

何はともあれ解決はしたので、同じ悩みの方がいてここを見て解決されたら幸いです