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