简体   繁体   English

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

[英]How save the state of the item on my fragment?

I'm getting a ArrayList from an Url with AsyncTask , and inserting into an ListView on my Fragment but everytime I change fragments I have to get json data from the Url again so I tried to use onSaveInstanceState() to save my ArrayList as a String and transform to my ArrayList using JsonObject and Gson Library but I can't save the data.我从带有AsyncTask的 Url 获取ArrayList ,并插入到我的Fragment上的ListView但每次更改片段时我都必须再次从 Url 获取 json 数据,因此我尝试使用onSaveInstanceState()将我的ArrayList保存为String并使用JsonObjectGson Library转换为我的ArrayList但我无法保存数据。

OnSave method OnSave 方法

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

            super.onSaveInstanceState(outState);
      }

OnCreateView method 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 {
    ...

Change Fragments method更改片段方法

   public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {

    switch (menuItem.getItemId()){

        case R.id.navigation_profile:
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.nav_fragment, perfilFragment)
                    .commit();
            return true;

Here is the solution, you just left to decide how to implement getTagForFragmentId() and getFragmentForFragmentTag(fragmentTag) , which should be simple.这是解决方案,您只需决定如何实现getTagForFragmentId()getFragmentForFragmentTag(fragmentTag) ,这应该很简单。

The idea of the code below is that you .hide() previous fragment presented and then you either .add(fragment) a new fragment, if it was not previously presented or .show() fragment if it is already inside the backstack.下面代码的想法是你.hide()之前的片段呈现,然后你要么.add(fragment)一个新片段,如果它以前没有呈现,或者.show()片段,如果它已经在 backstack 中。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM