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; 
} 

Meine benutzerdefinierten Pager-Adapter sieht wie folgt aus:Es ist möglich, Registerkarten in ViewPager zur Laufzeit hinzuzufügen/zu entfernen?

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 
} 

Das Problem, das ich habe ist, dass ich habe eine Registerkarte hinzuzufügen oder zu entfernen, wenn eine Schaltfläche geklickt wird, oder so etwas.

Auf jeder Registerkarte wird eine klassische Liste von Objekten angezeigt. Danke.

Antwort

2

Es gibt zwei Möglichkeiten, dies zu tun, obwohl ViewPager nicht geeignet für dynamische Entfernen ist:

1) Übergeben Sie ArrayList<Fragment> data als Parameter an PageAdapter

Dann Adapter wird wie folgt aussehen:

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

2) neu erstellen Adapter jedes Mal, wenn Sie Artikel löschen wollen:

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 

}

Element, das Sie in Aktivität \ Fragmente tun entfernen. Sie erstellen also im Grunde einen neuen Adapter mit neuen Daten.

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

Gibt es eine Möglichkeit, bei einem Klick ein weiteres Tab hinzuzufügen? –

+0

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

0

Statt mTabLayout.setupWithViewPager(mViewPager); verwenden Sie können Setup Ihre Tabs manuell:

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

Entfernen ist auch einfach: removeTabAt(int position) oder removeTab(Tab tab)

+0

Ja, das funktioniert. Aber wenn ich es von einer anderen Funktion aus aufrufen, stürzt es mit java.lang.NullPointerException ab: Versuch, virtuelle Methode 'android.support.design.widget.TabLayout $ Tab android.support.design.widget.TabLayout.newTab()' auf einem Null aufzurufen Objektreferenz –

+0

Gibt es eine Möglichkeit, bei einem Klick ein weiteres Tab hinzuzufügen? –

0

Hier habe ich eine bessere Lösung gefunden, um alle Ansichten/Fragmente aus dem aktuellen Kontext zu entfernen.

Hier habe ich TabLayout und ViewPage in Fragment verwendet. Also müssen wir Tabs von TabLayout, Ansichten von ViewPage und Fragmente von FragmentManager löschen.

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(); 
    } 
Verwandte Themen