Java 如何在我的片段上保存项目的状态?

Java 如何在我的片段上保存项目的状态?,java,android,android-savedstate,Java,Android,Android Savedstate,我使用AsyncTask从Url获取ArrayList,并将其插入Fragment上的ListView,但每次更改片段时,我都必须再次从Url获取json数据,因此我尝试使用onSaveInstanceState()将我的ArrayList保存为字符串并使用JsonObject和Gson库转换为我的ArrayList,但我无法保存数据 OnSave方法 @Override public void onSaveInstanceState(@NonNull Bun

我使用
AsyncTask
从Url获取
ArrayList
,并将其插入
Fragment
上的
ListView
,但每次更改片段时,我都必须再次从Url获取json数据,因此我尝试使用
onSaveInstanceState()
将我的
ArrayList
保存为
字符串
并使用
JsonObject
Gson库
转换为我的
ArrayList
,但我无法保存数据

OnSave方法

      @Override
            public void onSaveInstanceState(@NonNull Bundle outState) {
            outState.putString("cursos", this.cursosString);

            super.onSaveInstanceState(outState);
      }
OnCreateView方法

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    View view = inflater.inflate(R.layout.fragment_cursos, container, false);
    final ListView lvCursos = view.findViewById(R.id.lvCursos);

    if(savedInstanceState != null){

        Type arrayListCurso = new TypeToken<ArrayList<Curso>>(){}.getType();
        ArrayList<Curso> cursos = new Gson().fromJson(savedInstanceState.getString("cursos"), arrayListCurso);
        ListaCursosAdapter adapter = new ListaCursosAdapter(cursos, getActivity());
        lvCursos.setAdapter(adapter);

    } else {
    ...

这里是解决方案,您只需决定如何实现
getTagForFragmentId()
getFragmentForFragmentTag(fragmentTag)
,这应该很简单

下面代码的思想是,您可以
.hide()
显示以前的片段,然后添加(片段)一个新片段(如果以前未显示),或者
.show()
片段(如果它已经在backbackback中)

String lastPresentedFragmentTag = "";

public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
    switch (menuItem.getItemId()){
        case R.id.navigation_profile:
            // getTagForFragmentId() can be just a switch case function
            // or you can hardcode value instead
            String fragmentTag = getTagForFragmentId(R.id.navigation_profile);
            presentFragment(fragmentTag);
            return true;
        //...


public void presentFragment(String fragmentTag) {
    if (lastPresentedFragmentTag == fragmentTag) {
        return;
    }

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    // Hide previous fragment
    if (lastPresentedFragmentTag != null) {
        Fragment lastFragmenter code hereent = getSupportFragmentManager().findFragmentByTag(lastPresentedFragmentTag);
        ft.hide(lastFragment);
    }

    Fragment currentFragment = getSupportFragmentManager().findFragmentByTag(fragmentTag);
    if (currentFragment == null) {

            // Implement getFragmentForFragmentTag(fragmentTag) it will be another switch case function that will return you fragment
            val fragment = getFragmentForFragmentTag(fragmentTag);
            transaction.add(R.id.fragmentContainer, fragment, tag);
        } else {
            transaction.show(currentFragment);
        }
    }

    transaction.commitNow();
}

太多了,只是一个注释,它只在我不初始化
lastPresentedFragmentTag
时起作用,但代码解决了我的问题
String lastPresentedFragmentTag = "";

public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
    switch (menuItem.getItemId()){
        case R.id.navigation_profile:
            // getTagForFragmentId() can be just a switch case function
            // or you can hardcode value instead
            String fragmentTag = getTagForFragmentId(R.id.navigation_profile);
            presentFragment(fragmentTag);
            return true;
        //...


public void presentFragment(String fragmentTag) {
    if (lastPresentedFragmentTag == fragmentTag) {
        return;
    }

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    // Hide previous fragment
    if (lastPresentedFragmentTag != null) {
        Fragment lastFragmenter code hereent = getSupportFragmentManager().findFragmentByTag(lastPresentedFragmentTag);
        ft.hide(lastFragment);
    }

    Fragment currentFragment = getSupportFragmentManager().findFragmentByTag(fragmentTag);
    if (currentFragment == null) {

            // Implement getFragmentForFragmentTag(fragmentTag) it will be another switch case function that will return you fragment
            val fragment = getFragmentForFragmentTag(fragmentTag);
            transaction.add(R.id.fragmentContainer, fragment, tag);
        } else {
            transaction.show(currentFragment);
        }
    }

    transaction.commitNow();
}