My fragments in viewpager tab dont refresh

后端 未结 6 1985
我寻月下人不归
我寻月下人不归 2020-12-12 22:54

i got viewpager with 4 tabs .. in each tab there is a fragment. my first tab is a fragment with a form (for example Users) after i click save, the data is inserted in the da

相关标签:
6条回答
  • 2020-12-12 23:31

    Ok may be a late reply,might help others in future, so recently I faced same issue while fetching data from db into tabs it used to display only once I click on 3rd tab.. I tried above mentioned solution but nothing really worked.. fianlly i came across Otto This library allows you to communicate within your app..

    Just use this library to yourAdapter.notifyDataSetChanged() wherever you fetching your data from db..

    This video helped me alot https://www.youtube.com/watch?v=lVqBmGK3VuA

    0 讨论(0)
  • 2020-12-12 23:33

    first override in the fragment method

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if(isVisibleToUser){
            actionView();//call the method to be refreshed
        }
        else{
            //no
        }
    
    }
    
    0 讨论(0)
  • 2020-12-12 23:40

    The best way that I have discovered to simulate a "setOffscreenPageLimit(0)" behavior is by using an OnPageChangeListener in conjunction with overriding the getItemPosition method in your adapter. Something like this:

    In your custom pager adapter:

    @Override
    public int getItemPosition(Object object) {
         return POSITION_NONE;
    }
    

    Then in your Activity containing the ViewPager:

    final MyPagerAdapter adapter = new MyPagerAdapter();
    pager.setAdapter(adapter);
    pager.setOnPageChangeListener(new OnPageChangeListener() {
         @Override
         public void onPageSelected(int position) {
              ... anything you may need to do to handle pager state ...
              adapter.notifyDataSetChanged(); //this line will force all pages to be loaded fresh when changing between fragments
         }
    }
    

    This should have the same effect as setting the OffscreenPageLimit to 0. However, this functionality is sort of against what the ViewPager is designed to provide. If you are trying to implement a ViewPager in this way, it may be worth reevaluating your layout to be sure that a ViewPager is really what you want to use.

    0 讨论(0)
  • 2020-12-12 23:41

    In my experience, ViewPagers keep:

    • Your current tab
    • & 1 tab either side in memory

    So when you switch between 1 and 2, nothing is happening under the hood - it's like they are simply being hidden / shown.

    But when you navigate to tab 4, tabs 1 & 2 are destroyed (onDestroy() called), so when you navigate back to either of them, they are being re-created fresh (onCreate() called).

    As psykhi suggests, you could setOffScreenPageLimit() to 0, so that each fragment is created every time you navigate to it.

    If you were interested in keeping the other pages in memory for performance purposes, as they were designed with this is mind, you could use a messaging/event publishing system to send a message from tab 1 to tab 2 telling it to update when you submit the form on tab 1.

    0 讨论(0)
  • 2020-12-12 23:47

    UPDATE: There is a better way, Please have a look here: Update ViewPager dynamically?


    Removing content of this answer because it was a really bad way to access Fragments inside ViewPager, please see the above link for better approach.

    0 讨论(0)
  • 2020-12-12 23:49

    It's because you can specify the number of fragment your viewpager will "keep in RAM" (setOffScreenPageLimit () :I think the default is 1). So your second fragment is not reloaded. And when you go to a tab 3 or 4, then your 2 firsts fragments are deleted, then recreated when you come back.

    To refresh your fragment, there is many way to do it: you could implement a listener interface of your own in it to tell it when to refresh, or simply call a method that you would implement to update your contents.

    0 讨论(0)
提交回复
热议问题