Java Android Fragment getItem调用两次导致数据不出现?

Java Android Fragment getItem调用两次导致数据不出现?,java,android,android-fragments,Java,Android,Android Fragments,我的Android片段有这个问题。发生的事情是,我的表格中有一些片段s。我实例化它们没有问题,但是我遇到了一个问题,第一次实例化片段时,片段被创建,并且数据最初似乎被正确加载。但是,在最初加载所有数据之后,会有第二个调用来实例化片段,因为出于某种原因再次调用片段getItem(int position)方法。但是,由于我只在第一次初始化数据(我在片段中创建了一个static变量,该变量为我初始化数据),因此static变量已经知道数据已经正确加载,不应该再加载数据。因此,我的加载屏幕似乎连续出现

我的Android
片段有这个问题。发生的事情是,我的
表格中有一些
片段
s。我实例化它们没有问题,但是我遇到了一个问题,第一次实例化
片段时,片段被创建,并且数据最初似乎被正确加载。但是,在最初加载所有数据之后,会有第二个调用来实例化
片段
,因为出于某种原因再次调用
片段getItem(int position)
方法。但是,由于我只在第一次初始化数据(我在片段中创建了一个
static
变量,该变量为我初始化数据),因此
static
变量已经知道数据已经正确加载,不应该再加载数据。因此,我的加载屏幕似乎连续出现,因为无法获取第二次数据。有没有办法绕过这个问题?要么只实例化一次片段,要么只在创建
片段的第二次也是最后一次加载数据?这是我的密码:

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

编辑:我尝试将
locationService
变量设置为非静态,在片段第二次实例化时,getPublicPostsFromDatabase调用工作正常,但问题是
getPublicPostsFromDatabase
方法调用了两次。即使我在
getPublicPostsFromDatabase
中将
静态布尔变量设置为
true
,并且仅在
静态布尔变量
false
时调用
getPublicPostsFromDatabase
,只有在
getPublicPostsFromDatabase
完成后,
片段才会第二次实例化,这将再次调用
getPublicPostsFromDatabase

是否尝试使用布尔值

private Boolean mLoad = false;
当他们是负重的,把他放在真实的和负重放在这个条件

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

将setOffscreenPageLimit设置为“不再加载片段数据”。因此,请在下面的行中尝试此操作:

viewPager.setOffscreenPageLimit(yourNooftab);

我尝试使用布尔值,但问题似乎是
getPublicPostsFromDatabase
在第二次实例化
片段之前就完成了。结果,
getPublicPostsFromDatabase
再次被调用,这不是理想情况下我想要的。还有其他建议吗?@Ritesh您能详细说明一下什么是eventBus来管理数据加载吗?eventBus是一种依赖关系,您可以在应用程序中的任何位置触发事件并捕获事件,例如:-我认为这行不通。这是因为即使我将屏幕外页面限制设置为0,我的第一个选项卡也会被加载两次。