2016-10-19 2 views
-2

Ich habe dieses Problem mit meinem Android Fragment. Was passiert ist, dass ich ein paar Fragment s in meinem TabLayout habe. Ich instanziiere sie kein Problem, aber ich stoße auf ein Problem, wo das erste Mal, wenn ich die Fragment instanziiere, das Fragment erstellt wird und die Daten am Anfang korrekt geladen werden. Nachdem jedoch alle Daten initial geladen wurden, gibt es einen zweiten Aufruf, um die Fragment zu instanziieren, da die Methode Fragment getItem(int position) aus irgendeinem Grund noch einmal aufgerufen wird. Da ich die Daten jedoch nur beim ersten Mal initialisiere (es gibt eine static Variable, die ich in meinem Fragment erstellt habe und die Daten für mich initialisiert), weiß die static Variable bereits, dass die Daten bereits korrekt geladen wurden und nicht geladen werden sollten Daten erneut. Als Ergebnis scheint mein Ladebildschirm kontinuierlich zu erscheinen, da die zweiten Zeitdaten nicht abgerufen werden können. Gibt es eine Möglichkeit, dies zu umgehen? Entweder wird das Fragment nur einmal instanziiert oder die Daten nur zum zweiten und letzten Mal geladen, wenn Fragment erstellt wird? Hier ist mein Code:Android-Fragment getItem zweimal aufgerufen, wodurch Daten nicht angezeigt werden?

private void setupTabLayout() { 
    View layout = findViewById(R.id.activity_main); 
    if (layout != null) { 
     tabLayout = (TabLayout) layout.findViewById(R.id.tab_layout); 
    } 
    tabLayout.addTab(tabLayout.newTab().setText("First Fragment")); 
    tabLayout.addTab(tabLayout.newTab().setText("Second Fragment")); 
    tabLayout.addTab(tabLayout.newTab().setText("Third Fragment")); 
    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); 
    if(viewPager != null) { 
     viewPager.setOffscreenPageLimit(3); 
     final PagerAdapter adapter = new PagerAdapter 
       (getSupportFragmentManager(), tabLayout.getTabCount()); 
     viewPager.setAdapter(adapter); 
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 

      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 

      } 
     }); 
    } 
} 

PagerAdapter.java

public class PagerAdapter extends FragmentStatePagerAdapter{ 
    int numTabs; 

    public PagerAdapter(FragmentManager fm, int numTabs) { 
     super(fm); 
     this.numTabs = numTabs; 
    } 

    @Override 
    public Fragment getItem(int position) { 

     switch (position) { 
      case 0: 
       //Here, the PublicTabFragment is instantiated twice, 
       //causing the onResume and onCreate methods of my PublicTabFragment() 
       //to be called twice. 
       PublicTabFragment tab1 = new PublicTabFragment(); 
       return tab1; 
      case 1: 
       FollowersTabFragment tab2 = new FollowersTabFragment(); 
       return tab2; 
      case 2: 
       ProfileTabFragment tab3 = new ProfileTabFragment(); 
       return tab3; 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     return numTabs; 
    } 

PublicTabFragment:

private View fragmentView; 
private View progressOverlay; 
//Declared static so I don't have to call getPublicPostsFromDatabase twice 
private static LocationService locationService; 
private static Location currentLocation; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    if (fragmentView == null) { 
     fragmentView = inflater.inflate(R.layout.posts_tab, container, false); 
    } 
    return fragmentView; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    setupLocation(); 
} 

private void setupLocation() { 
    Context context = getContext(); 
    //Checked once staticly so I don't have to call getPublicPostsFromDatabase twice 
    if(locationService == null) { 
     locationService = new LocationService(context, new LocationUpdateListener() { 
      @Override 
      public void canReceiveLocationUpdates() { 

      } 

      @Override 
      public void cannotReceiveLocationUpdates() { 
       //well we know we cant receive updates so we have to create a settings request 
      } 

      //update location to our servers for tracking purpose 
      @Override 
      public void updateLocation(Location location) { 
       if (location != null) { 
        currentLocation = location; 
        progressOverlay = fragmentView.findViewById(R.id.progress_overlay); 
        progressOverlay.setVisibility(View.VISIBLE); 
        swipeContainer = (SwipeRefreshLayout) fragmentView.findViewById(R.id.swipeContainer); 
        swipeContainer.setColorSchemeResources(R.color.colorPrimary); 
        databaseQuery.getPublicPostsFromDatabase(currentLocation, progressOverlay, fragmentView, getContext(), R.id.public_posts_feed); 
       } 
      } 

      @Override 
      public void updateLocationName(String localityName, Location location) { 
       locationService.stopLocationUpdates(); 
      } 
     }); 
     locationService.startUpdates(); 
    } 
} 

EDIT: Ich habe versucht, die locationService Variable nicht auf statische und die getPublicPostsFromDatabase Anrufeinstell- funktioniert auf die Beim zweiten Mal wird das Fragment instanziiert, aber dann tritt das Problem auf, dass die Methode getPublicPostsFromDatabase zweimal aufgerufen wird. Auch wenn richtete ich ein static boolean variabletrue im getPublicPostsFromDatabase zu sein und nur getPublicPostsFromDatabase zu nennen, wenn die static boolean variablefalse ist, wird die Fragment ein zweites Mal instanziiert erst nach getPublicPostsFromDatabase Oberflächen, die dann getPublicPostsFromDatabase erneut aufgerufen machen.

Antwort

0

Haben Sie es mit einem booleschen Befehl versucht?

private Boolean mLoad = false; 

und wenn sie Last sind, setzen Sie ihn auf true und für Last setzen diese Bedingung

if (!mLoad) { 
    ... 
    mLoad = true; 
} 
+0

bessere Möglichkeit, EventBus zu verwenden, um Daten zu laden – Ritesh

+0

Ich habe versucht mit einem booleschen, aber das Problem scheint, dass die 'getPublicPostsFromDatabase' abgeschlossen ist, bevor das zweite Mal das' Fragment' i ist nstantiiert. Als Ergebnis wird 'getPublicPostsFromDatabase' erneut aufgerufen, was nicht ideal ist. Irgendwelche anderen Vorschläge? – user1871869

+0

@Ritesh könnten Sie erläutern, was Sie mit einem eventBus meinen, um das Laden der Daten zu verwalten? – user1871869

0

die setOffscreenPageLimit Set für nicht die Fragmentdaten laden again.so versuchen, diese unter der Linie:

viewPager.setOffscreenPageLimit(yourNooftab); 
+0

Ich glaube nicht, dass das funktionieren würde. Dies liegt daran, dass meine erste Registerkarte zweimal geladen würde, egal was passiert, selbst wenn ich die Seitenbegrenzung für den Bildschirm auf 0 setze. – user1871869

Verwandte Themen