18

横スクロール テーブル用の ViewPager を使用してアプリを開発しています。別のテーブル セットをロードするためにアダプターを変更する必要がある場合があります。私は次のことを試みました:

mViewPager.setAdapter(new pagerAdapterPushed(getSupportFragmentManager()));
mViewPager.getAdapter().notifyDataSetChanged();
indicator.setViewPager(mViewPager);
indicator.invalidate();
mViewPager.invalidate();

ただし、常に以前のデータをリロードします。ViewPager のアダプタを変更することはできませんか?

4

6 に答える 6

34

私のAPPがやっているのとまったく同じように...

ViewPagerAdapter を変更するために、私がしたことは次のとおりです。

  1. 現在のアダプタ内のすべてのフラグメントをクリア

  2. 現在のアダプタを null に設定

  3. ViewPager に新しいアダプタを割り当てる

    /* Clear all Fragments inside current adapter */
    public class MyPagerAdapter extends FragmentPagerAdapter
    {
      private ArrayList<Fragment> fragments = new ArrayList<Fragment>();
      //...some stuff
    
      public void clearAll() //Clear all page
      {
        for(int i = 0; i < fragments.size(); i ++)
        fragMan.beginTransaction().remove(fragments.get(i)).commit();
        fragments.clear();
      }
    }
    
    /* Set current adapter to null */
    Constants.VP.removeAllViews();
    Constants.VP.setAdapter(null);
    
    /* Assign new adpater for ViewPager */
    Constants.PAGER = new MyPagerAdapter(getSupportFragmentManager());
    Constants.VP.setAdapter(Constants.PAGER);
    

それが役立つことを願って〜

于 2013-04-11T09:18:00.913 に答える
3

public int getItemPosition (Object object)ページャーアダプターでオーバーライドする必要があります。POSITION_UNCHANGEDビューページャーのすべての要素について、(ページャーにまだある場合) またはPOSITION_NONE(削除された場合)を返す必要があります。そうしないと、ビュー ページャーは何かが変更されたことを認識できません。古いアダプターのデータを消去するだけで、新しいアダプターを設定することはお勧めしません。

于 2013-02-12T05:37:04.070 に答える
2

@RRTW の方法が一部の人にとってはうまくいったことがわかりましたが、私にとってはうまくいきませんでした (近いものでしたが)。commitNow()通常の代わりにないcommit()と、正しく機能しません。私はそのようなことをしました:

private fun changePagerAdapter(newAdapter: PagerAdapter) {

    val transaction = supportFragmentManager.beginTransaction()
        supportFragmentManager.fragments.forEach {
        transaction.remove(it)
    }

    transaction.commitNow()
    view_pager.adapter = newAdapter
}
于 2018-07-13T06:17:03.667 に答える