Android Fragments 当切换回片段时,片段再次发出改型请求

8gsdolmq  于 2023-03-08  发布在  Android
关注(0)|答案(4)|浏览(148)

我在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;

 }

我怎样才能得到我想要的结果?

nnsrf1az

nnsrf1az1#

我认为这里的问题是你使用fragmentTransaction.replace。所以当你切换标签。它破坏了当前的片段并添加了一个新的片段,你的片段再次创建。为了解决这个问题,我建议使用viewpager。

pbgvytdp

pbgvytdp2#

一旦你得到你的数据,你可以缓存到一个仓库。每次你需要你的数据检查,如果数据已经存在,如果没有下载他们再次。

f3temu5u

f3temu5u3#

如果你看到片段的生命周期,当重新创建它时,它从onCreateView开始,并且onAttachonCreate只有在第一次创建片段时才被调用。
1.仅在onCreate方法中进行API调用和所有变量的初始化,这些变量的数据要持久化。
1.使用ViewModel代替,因为即使重新创建片段,它也会保留其状态。
如果两个片段都显示为两个选项卡,我希望您只使用ViewPager实现了它们,如果您在两个片段之间滑动,它会默认保留状态。

qaxu7uf2

qaxu7uf24#

创建一个公共类,并创建一个静态变量,用于存储页面是第一次访问还是以后访问,如果以后访问,则不加载数据,否则加载数据。
在Common类中创建布尔变量

public static boolean first=false;

然后在你的活动中这样做

if(Common.first==false)
{
Common.first=true;
loadVideos();
}
else
{
//dont load list
}

相关问题