我在MainActivity
类中实现了底部导航栏,它有两个片段。我在两个片段中都发出了Retrofit请求。问题是,当我切换片段并返回到前一个片段时,它再次发出请求,之前的数据丢失。我不希望这样,我希望在发出请求后,数据保留在片段中。
下面是我的代码:
- 主要活动类别**
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setTitle("Home");
HomeFragment fragment = new HomeFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.container, fragment);
fragmentTransaction.commit();
bottomBar = findViewById(R.id.bottomBar);
bottomBar.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch(item.getItemId()){
case R.id.navigation_home:
HomeFragment fragment = new HomeFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.container, fragment);
fragmentTransaction.commit();
toolbar.setTitle("Home");
return true;
case R.id.navigation_video:
VideoFragment fragment1 = new VideoFragment();
FragmentTransaction fragmentTransaction1 = getSupportFragmentManager().beginTransaction();
fragmentTransaction1.replace(R.id.container, fragment1);
fragmentTransaction1.commit();
toolbar.setTitle("Videos");
return true;
}
return false;
}
});
}
- 主页片段.类**
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_home, container, false);
recycle = view.findViewById(R.id.recycle);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
recycle.setLayoutManager(mLayoutManager);
recycle.setHasFixedSize(true);
loadFacts();
return view;
}
- 视频片段类**
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_video, container, false);
recycle = view.findViewById(R.id.recycle);
LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
recycle.setLayoutManager(mLayoutManager);
recycle.setHasFixedSize(true);
loadVideos();
return view;
}
我怎样才能得到我想要的结果?
4条答案
按热度按时间nnsrf1az1#
我认为这里的问题是你使用fragmentTransaction.replace。所以当你切换标签。它破坏了当前的片段并添加了一个新的片段,你的片段再次创建。为了解决这个问题,我建议使用viewpager。
pbgvytdp2#
一旦你得到你的数据,你可以缓存到一个仓库。每次你需要你的数据检查,如果数据已经存在,如果没有下载他们再次。
f3temu5u3#
如果你看到片段的生命周期,当重新创建它时,它从
onCreateView
开始,并且onAttach
和onCreate
只有在第一次创建片段时才被调用。1.仅在
onCreate
方法中进行API调用和所有变量的初始化,这些变量的数据要持久化。1.使用
ViewModel
代替,因为即使重新创建片段,它也会保留其状态。如果两个片段都显示为两个选项卡,我希望您只使用
ViewPager
实现了它们,如果您在两个片段之间滑动,它会默认保留状态。qaxu7uf24#
创建一个公共类,并创建一个静态变量,用于存储页面是第一次访问还是以后访问,如果以后访问,则不加载数据,否则加载数据。
在Common类中创建布尔变量
然后在你的活动中这样做