簡體   English   中英

如何在我的片段上保存項目的狀態?

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

我從帶有AsyncTask的 Url 獲取ArrayList ,並插入到我的Fragment上的ListView但每次更改片段時我都必須再次從 Url 獲取 json 數據,因此我嘗試使用onSaveInstanceState()將我的ArrayList保存為String並使用JsonObjectGson Library轉換為我的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 {
    ...

更改片段方法

   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;

這是解決方案,您只需決定如何實現getTagForFragmentId()getFragmentForFragmentTag(fragmentTag) ,這應該很簡單。

下面代碼的想法是你.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