Reputation: 285
In my app I have a fragment that contains a ListView
. The items of the list are clickable, so a new activity is opened and proceeds with the necessary information from the list item. When I return from that activity to my Fragment
it is reloaded, but I would like to not fetch the whole data again and just resume to it.
I noticed that there are other questions about how to prevent the reloading when the Fragment
is changed, but I didn’t find a working solution about changing to another activity and returning without forcing it to reload. Is there a way prevent it in that case as well? And is it implemented in the MainActivity
or the specific Fragment
then?
My MainActivity with the ViewPager
:
public class MainActivity extends AppCompatActivity {
private ViewPager viewPager;
public BottomNavigationView bottomNavigationView;
QuestionsFragment questionsFragment;
GroupsFragment groupsFragment;
ProfileFragment profileFragment;
MenuItem prevMenuItem;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Initializing viewPager
viewPager = (ViewPager) findViewById(R.id.viewpager);
//Initializing the bottomNavigationView
bottomNavigationView = (BottomNavigationView)findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(
new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_questions:
viewPager.setCurrentItem(0);
break;
case R.id.navigation_groups:
viewPager.setCurrentItem(1);
break;
case R.id.navigation_profile:
viewPager.setCurrentItem(2);
break;
}
return false;
}
});
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
if (prevMenuItem != null) {
prevMenuItem.setChecked(false);
}
else
{
bottomNavigationView.getMenu().getItem(0).setChecked(false);
}
Log.d("page", "onPageSelected: "+position);
bottomNavigationView.getMenu().getItem(position).setChecked(true);
prevMenuItem = bottomNavigationView.getMenu().getItem(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
setupViewPager(viewPager);
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
questionsFragment = new QuestionsFragment();
groupsFragment = new GroupsFragment();
profileFragment = new ProfileFragment();
adapter.addFragment(questionsFragment);
adapter.addFragment(groupsFragment);
adapter.addFragment(profileFragment);
viewPager.setAdapter(adapter);
int limit = adapter.getCount();
viewPager.setOffscreenPageLimit(limit);
}
}
The Fragment I‘d like to resume to:
public class QuestionsFragment extends Fragment {
private RecyclerView recyclerView;
private RecyclerView.Adapter recyclerViewAdapter;
private RecyclerView.LayoutManager recyclerViewlayoutManager;
private List<QuestionModel> questionList;
public QuestionsFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_questions, container, false);
//fill questionList
recyclerViewAdapter = new RecyclerViewQuestionAdapter(questionList, getActivity());
recyclerView.setLayoutManager(recyclerViewlayoutManager);
recyclerView.setAdapter(recyclerViewAdapter);
return view;
}
}
Upvotes: 0
Views: 628
Reputation: 86
Hi your ViewPagerAdapter
must extends FragmentStatePageAdapter
than the FragmentPagerAdapter
if not.
FragmentStatePageAdapter
holds the fragment states on tab changes and when you come back and forth .
The Fragment instance is recreated once you return back to an existing item and the state is restored. This adapter is suitable for lists with an unknown count or for lists where the items change a lot.
setOffscreenPageLimit() to 3 or 2 as u r using 3 fragments as least .
When using FragmentPagerAdapter you must make sure to clear any references to the current View or Context in onDestroyView()
Upvotes: 1