android-support-v4のViewPagerで、ユーザーがページを増やしたり減らしたりできる可変長のビューを作る場合の話です。
ページの追加、削除を行うときにはFragmentStatePagerAdapterを使うのはいろんなところで書かれてるので理由とか使い方は割愛します
そのFragmentStatePagerAdapterでページの削除をする時ですが、Activity側で何らかのイベントを受け取って、現在見ているページを閉じるという処理をしたいと思います。単純に書くと
public void removeCurrentPage()
{
int current = pager.getCurrentItem();
adapter.remove(current);
adapter.notifyDataSetChanged();
}
みたいなことになりそうですが、これだとViewPagerに反映されませんでした。あれこれ試行錯誤して最終的にいきついたのは
public void removeCurrentPage()
{
int current = pager.getCurrentItem();
adapter.remove(current);
List<Fragment> list = new ArrayList<Fragment>();
list.addAll(adapter.getList());
adapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), list); //Refresh page caches
pager.setAdapter(adapter);
pager.setCurrentItem(current, false);
}
adapterから要素を削除したのち、Listを出力してadapterを初期化、改めてListを渡してViewPagerにadapterをセットしなおして元の位置を表示させる
というすごい回りくどい処理をしてますが、これで今のところページの削除は滞り無くできてます
ページの追加のほうは単純にadapterにaddするだけで出来るんですが、削除のほうはViewPager側のキャッシュが残るためこういう処理が必要なんじゃないかと思います。
もしもっといいやり方がありましたら教えて下さい