2012-11-19 9 views
10

Ich benutze das Projekt "Tabs + Swipe" und es fällt mir schwer, ein Fragment zu entfernen.Tabs + ViewPager + FragmentStatePagerAdapter - Wie Fragment zu entfernen?

Schritte ich tue:

  1. Entfernen Registerkarte Datenbank
  2. Entfernen Registerkarte aus der FragmentStatePagerAdapter Datenquelle
  3. Entfernen Registerkarte aus dem ActionBar.
  4. Fragment mit dem Support FragmentManager entfernen.

Das Problem: Nachdem ich das Entfernen aus irgendeinem Grund durchführen, kann ich immer noch nach rechts scrollen und ein leeres Fragment sehen. Ich kann es nicht auswählen, es springt einfach zurück. Es scheint, als ob das Fragment nicht entfernt wird, sondern seine Position zum Tag von links ändert.

Mein Adapter:

public class SectionsPagerAdapter extends FragmentStatePagerAdapter { 

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

     @Override 
     public Fragment getItem(int position) { 
      Fragment fragment = new TabFragment(); 

      Bundle args = new Bundle(); 
      args.putInt(TabFragment.ARG_TAB_POSITION, position); 
      fragment.setArguments(args); 

      return fragment; 
     } 

     @Override 
     public int getCount() { 
      return tabsList.size(); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return tabsList.get(position).getTitle(); 
     } 

     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) { 
      super.destroyItem(container, position, object); 
      FragmentManager manager = ((Fragment)object).getFragmentManager(); 
      android.support.v4.app.FragmentTransaction trans = manager.beginTransaction(); 
      trans.remove((Fragment)object); 
      trans.commit(); 
     } 
    } 

Meine Methode remove (aus dem Fragment genannt):

public void removeTab() { 
      mTabTableHandler.deleteTab(tab.getId()); //db 
      tabsList.remove(tabPosition); //data source 
      actionBar.removeTabAt(tabPosition); // actionbar 

      getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); // support fragmentmanager 

      tabsList = mTabTableHandler.query(); //requery db 
      mSectionsPagerAdapter.notifyDataSetChanged(); //notify adapter 
     } 

die Hilfe zu schätzen wissen!

Antwort

4

Sie die Antwort finden Sie hier - Remove Fragment Page from ViewPager in Android

es scheint, was in Ihrem Code fehlt der folgenden Adapter-Methode überschrieben wird:

@Override 
public int getItemPosition(Object object){ 
    return PagerAdapter.POSITION_NONE; 
} 

Erklärung, warum eine solche „weird“ Lösung funktioniert können Sie feststellen, in der Antwort auf die Frage in dem Link habe ich Ihnen zur Verfügung gestellt.

+0

in der Tat eine seltsame Lösung. Vielen Dank :) –

0
public void removeAllFragments(ViewGroup container) { 
     /* 
     * keep this line because section pager adapter has 
     * the bug to not delete the last fragment completely 
     * -> so we add an empty fragment 
     */ 
     int iStart = 0; 

     addFragment(new Fragment()); 
     Fragment frag; 
     int size = fragments.size(); 
     for (int iPos = iStart; iPos < size; iPos++) { 
      frag = getItem(iStart); 
      if (frag.isAdded()) { 
       destroyItem(container, iStart, frag); 
      } 
      fragments.remove(frag); 
      notifyDataSetChanged(); 
     } 
    }