LoginSignup
38
36

More than 5 years have passed since last update.

ViewpagerのFragmentを動的に更新

Last updated at Posted at 2014-06-16

viewpagerで、Fragmentを利用する場合、
Activityの様に実装しても、更新されません。

FragmentPagerAdapter内では、Fragmentmanagerにて管理されているため、こちらを更新させる必要があります。

FragmentPagerAdapterの実装

  @Override
  public int getItemPosition(Object object) {
    return POSITION_NONE;
  }
  public void destroyAllItem(ViewPager pager) {
    for (int i = 0; i < getCount() - 1; i++) {
      try {
        Object obj = this.instantiateItem(pager, i);
        if (obj != null)
          destroyItem(pager, i, obj);
        } catch (Exception e) {
        }
      }
  }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);

        if (position <= getCount()) {
            FragmentManager manager = ((Fragment) object).getFragmentManager();
            FragmentTransaction trans = manager.beginTransaction();
            trans.remove((Fragment) object);
            trans.commit();
        }
    }

2016/01/25 ご指摘のありました、下記については、申し訳ありませんが、私の方にて試すことが暫くできないため、実装者様側にて、getCount() - 1 が正しいかは判断お願い致します。

for (int i = 0; i < getCount() - 1; i++) {

⚠️getItemPosition()で、POSITION_NONEをreturnする

Activity側の実装

public class MainActivity extends ActionBarActivity {

  private FragmentAdapter _pagerAdapter;
  private void updateFragment() {
    ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
    pager.setOnPageChangeListener(pagerListner);
    _pagerAdapter.destroyAllItem(pager);
    _pagerAdapter.setResource(resources);
    _pagerAdapter.notifyDataSetChanged();
    pager.setAdapter(_pagerAdapter);
  }
}

私がやりたかったのは、3枚のFragmentをボタンアクション時に、異なった内容の3枚のFragmentに変更する
ことだったので、変更ボタンaction時に

まず、
destroyAllItem()
をcallします。

次に、新しいリソース(表示したいもの)をセット
setResource()

そして、
notifyDataSetChanged()
で変更通知

viewpagerにadapterをセットして完了


ちょっと適当に作っていますが、、、
サンプルソース

38
36
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
36