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 variable
true
im getPublicPostsFromDatabase
zu sein und nur getPublicPostsFromDatabase
zu nennen, wenn die static boolean variable
false
ist, wird die Fragment
ein zweites Mal instanziiert erst nach getPublicPostsFromDatabase
Oberflächen, die dann getPublicPostsFromDatabase
erneut aufgerufen machen.
bessere Möglichkeit, EventBus zu verwenden, um Daten zu laden – Ritesh
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
@Ritesh könnten Sie erläutern, was Sie mit einem eventBus meinen, um das Laden der Daten zu verwalten? – user1871869