I am trying to implement Instagram-like user profile screen. This is my flow ProfileFragment --> SingleImageFragment --> ProfileFragment --> SingleImageFragment
. So, the user can have multiple instances of the same fragment
. I don't want to hide/show because it costs too much memory. So I am using
mFragment = fragment;
mFragmentManager
.beginTransaction()
.replace(R.id.frame_container, fragment, Integer.toString(getFragmentCount()))
.addToBackStack(null)
.commit();
But, this way ProfileFragment
goes into onDestroyView
and when it is returned from backStack
the list will be loaded again since it goes to onViewCreated
method. I am trying to find a way how to not load the data that has already been loaded when coming to that fragment
. Is there a way that I can save the already loaded list and use that one in onViewCreated
?
This is ProfileFragment
:
public class ProfileFragment extends BaseChildFragment implements ProfileAdapter.OnHeaderItemClickedListener,
SwipeRefreshLayout.OnRefreshListener {
public static final String ACTION_SINGLE_IMAGE = ProfileFragment.class.getName() + ".single_image";
public static final String ACTION_SETTINGS = ProfileFragment.class.getName() + ".settings";
private static final String ARG_PARAM1 = "param1";
FragmentProfileBinding mBinder;
FragmentManager mFragmentManager;
Home mHome;
Home tHome;
List<Home> mHomeList;
ProfileAdapter mAdapter;
StaggeredGridLayoutManager mManager;
EndlessRecyclerViewScrollListener mEndlessScrollListener;
PreferenceAdapter mPreferenceAdapter;
int mInstance;
public ProfileFragment() {
}
public static ProfileFragment newInstance(int instance) {
ProfileFragment fragment = new ProfileFragment();
Bundle args = new Bundle();
args.putInt(ARGS_INSTANCE, instance);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mInstance = getArguments().getInt(ARGS_INSTANCE);
}
mHomeList = new ArrayList<>();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mBinder = DataBindingUtil.inflate(inflater, R.layout.fragment_profile, container, false);
mFragmentManager = getChildFragmentManager();
mHome = new Home();
tHome = new Home();
mPreferenceAdapter = new PreferenceAdapter(getContext());
mManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
mAdapter = new ProfileAdapter(getContext(), mHomeList);
mBinder.rvGrid.setLayoutManager(mManager);
mBinder.rvGrid.setAdapter(mAdapter);
mAdapter.addOnHeaderItemClickListener(this);
mBinder.srLayout.setOnRefreshListener(this);
mEndlessScrollListener = new EndlessRecyclerViewScrollListener(mManager) {
@Override
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
populateList();
populateSecondList();
mAdapter.notifyDataSetChanged();
}
};
mBinder.rvGrid.addOnScrollListener(mEndlessScrollListener);
setUIListeners();
return mBinder.getRoot();
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
populateList();
populateSecondList();
}
@Override
public void onDestroyView() {
super.onDestroyView();
mAdapter.removeOnHeaderItemClickListener();
mBinder.rvGrid.removeOnScrollListener(mEndlessScrollListener);
}
private void setUIListeners() {
}
@Override
public void onGridImageClicked(Home home) {
sendActionToParent(ACTION_SINGLE_IMAGE);
}
@Override
public void onRefresh() {
mHomeList.clear();
populateList();
populateSecondList();
mAdapter.notifyDataSetChanged();
mEndlessScrollListener.resetState();
mBinder.srLayout.setRefreshing(false);
}
private void sendActionToParent(String action) {
if (mParentListener == null) {
return;
}
Bundle bundle = new Bundle();
bundle.putString(Constants.ACTION_KEY, action);
mParentListener.onChildFragmentInteraction(bundle);
}
private void sendActionToActivity(String action) {
if (mActivityListener == null) {
return;
}
Bundle bundle = new Bundle();
bundle.putString(Constants.ACTION_KEY, action);
mActivityListener.onChildFragmentToActivityInteraction(bundle);
}
private void populateList() {
for (int i = 0; i < 5; i++) {
mHome.setType(0);
mHomeList.add(i, mHome);
}
}
private void populateSecondList() {
for (int i = 0; i < 5; i++) {
tHome.setType(1);
mHomeList.add(i, tHome);
}
}
}