0

I have implemented some fragments which are hosted by a single Activity (they're in the same activity). In one of these fragments (Let's say fragment A), I have a vertical recyclerview.

The problem is arises when I want to navigate from Fragment A to other fragments (Again, in the same activity). Suppose that I'm clicking the middle member of the list, then I navigate to the next fragment. When I want to back into the first fragment (Fragment A), it inflates the list from first. Seeming that it looses its position, however, using onSaveInstanceState() and also onCreateView(), I try to store and restore the selected item's position every time I quit or enter the fragment.

I think this issue may be originated from fragments' lifecycle which all are in one single activity. As this answer, mentioning :

In a Fragment, all of their lifecycle callbacks are directly tied to their parent Activity. So onSaveInstanceState gets called on the Fragment when its parent Activity has onSaveInstanceState called.

and that's why I emphasize on the "single" activity. How can we handle such situation?

I have debugged my program and onSaveInstanceState and onCreateView were not even called when they were supposed to. Below is my attempted code:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(savedInstanceState!=null){
        selectedItem = savedInstanceState.getInt(BUNDLE_KEY_SELECTED_ITEM);
    }
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {                    
    if (savedInstanceState != null){
        selectedItem = savedInstanceState.getInt(BUNDLE_KEY_SELECTED_ITEM);
    }
    myRecyclerView = (RecyclerView) v.findViewById(R.id.rv_mine);

    // mData is a an ArrayList
    myAdapter = new MyAdapter(mData, getContext(), this.selectedItem);  
    myLayoutManager = new LinearLayoutManager(getActivity());
    myRecyclerView.setLayoutManager(myLayoutManager);

    myRecyclerView.setAdapter(myAdapter);

    return v;
}


@Override
public void onSaveInstanceState(Bundle outState) {
    outState.putInt(BUNDLE_KEY_SELECTED_ITEM,selectedItem);
    super.onSaveInstanceState(outState);
}
inverted_index
  • 2,329
  • 21
  • 40

1 Answers1

1

Well you can use .add() to add fragments to your activity than .replace(), Which preserves the state of the fragment within the activity, and if using replace function which will cause the onCreateView callback to trigger again.

Sanoop Surendran
  • 3,484
  • 4
  • 28
  • 49