3
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    Log.v(TAG, "onCreateView"); 

    View rootView = inflater.inflate(R.layout.fragment_home, container, false); 

    // setting up the view pager and tab layout 
    mViewPager = (ViewPager) rootView.findViewById(R.id.view_pager); 
    mTabLayout = (TabLayout) rootView.findViewById(R.id.tab_layout); 
    PageAdapter adapter = new PageAdapter(getFragmentManager()); 
    mViewPager.setAdapter(adapter); 

    mTabLayout.setupWithViewPager(mViewPager); 
    mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout)); 

    return rootView; 
} 

マイカスタムページャアダプタは次のようになります。実行時にViewPagerでタブを追加/削除することは可能ですか?

public class PageAdapter extends FragmentStatePagerAdapter { 

    public PageAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return new GroupTabFragment(position); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     String title = ""; 
     switch (position) { 
      case 0: 
       title = "Game"; // this is from a template, i have to 
       break;    // return title dynamically 
      case 1: 
       title = "Movie"; 
       break; 
     } 
     return title; 
    } 

    @Override 
    public int getCount() { 
     return 2;     // the tabs number is a subject of change 
    }        // i don't know it from the begining 
} 

私が持っている問題は、私はボタンがクリックされたときにタブを追加または削除する必要がある、またはこのようなもの。

各タブには、古典的なオブジェクトリストが表示されます。 ありがとうございます。代わりに、手動でセットアップあなたのタブをmTabLayout.setupWithViewPager(mViewPager);をすることができます使用しての

答えて

2

ViewPagerが動的除去するのには適していませんが、これを行う2つの方法があります。

1)パラメータとしてArrayList<Fragment> dataPageAdapter

に渡します。 )

data.remove(fragmentId); 
adapter.notifyDataSetChanged(); 

2アダプターにあなたがアイテムを削除するたびに再作成します。あなたが活動\フラグメントで行う項目を削除する

public class PageAdapter extends FragmentStatePagerAdapter { 
private ArrayList<Fragment> data; 

public PageAdapter(FragmentManager fm, ArrayList<Fragment> data) { 
    super(fm); 
    this.data = data; 
} 

@Override 
public Fragment getItem(int position) { 
    return data.get(position); 
} 

@Override 
public CharSequence getPageTitle(int position) { 
    String title = ""; 
    switch (position) { 
     case 0: 
      title = "Game"; // this is from a template, i have to 
      break;    // return title dynamically 
     case 1: 
      title = "Movie"; 
      break; 
    } 
    return title; 
} 

@Override 
public int getCount() { 
    return data.size();     // the tabs number is a subject of change 
}        // i don't know it from the begining 

}

アダプタは次のようになります。つまり、基本的に新しいデータで新しいアダプタを作成します。

data.remove(fragmentId); 
PageAdapter adapter = new PageAdapter(getFragmentManager(), data); 
mViewPager.setAdapter(adapter); 
+0

ボタンクリックで別のタブを追加する可能性はありますか? –

+0

jup。 'data.add(new YourFragment()); adapter.notifyDataSetChanged(); ' – AnZ

0

mTabLayout.addTab(mTabLayout.newTab().setText("Movie")); 
mTabLayout.addTab(mTabLayout.newTab().setText("Game")); 
mTabLayout.addTab(mTabLayout.newTab().setText("Audio")); 
mTabLayout.setOnTabSelectedListener(this); 

取り外しも簡単です:removeTabAt(int position)またはremoveTab(Tab tab)

+0

はい、これは機能します。しかし、別の関数から呼び出すとjava.lang.NullPointerExceptionでクラッシュする:仮想メソッド 'android.support.design.widget.TabLayout $ Tab android.support.design.widget.TabLayout.newTab()'をnullで呼び出そうとしているオブジェクト参照 –

+0

ボタンをクリックしたときに別のタブを追加する可能性はありますか? –

0

ここで、現在のコンテキストからすべてのビュー/フラグメントを削除するためのより良い解決策を見つけました。

ここでは、Fragment内でTabLayoutとViewPageを使用しました。 したがって、TabLayout、ViewPageのビュー、FragmentManagerのフラグメントからタブをクリアする必要があります。

private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = new ArrayList<>(); 

    FragmentManager fragmentManager = null; 
    public TabLayout tabLayout; 
    public ViewPager viewPager; 

    public ViewPagerAdapter(FragmentManager manager, TabLayout tabLayout, ViewPager pager) { 
     super(manager); 
     this.fragmentManager= manager; 
     this.tabLayout = tabLayout; 
     this.viewPager= pager; 
    } 

    public void removeAll() { 
     tabLayout.removeAllTabs(); 
     viewPager.removeAllViewsInLayout(); 
     viewPager.removeAllViews(); 
     viewPager.setAdapter(null); 

     fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
     if (manager.getFragments() != null) { 
      manager.getFragments().clear(); 
     } 
     viewPager.setAdapter(adapterPage); 
     viewPager.invalidate(); 
     viewPager.requestLayout(); 

     mFragmentList.clear(); 
     mFragmentTitleList.clear(); 
    } 
関連する問題