Search code examples
androidandroid-viewpagermaterial-designandroid-tabs

how to refresh the fragment when tab is reselected , MaterialTabHost


I am using MaterialtTabHost and ViewPager and i want that whenever i switch to new tab it should be updated with new data automatically.

This is my activity in which i have added the tabs and viewPager for every ViewPager i have a different Fragment to show.

public class FrontPage_Activity extends AppCompatActivity implements MaterialTabListener {
    ViewPager mPager;
    StorageUtil storageUtil;
    User user;
    MaterialTabHost tabHost;
    Toolbar toolbar;
    MyPageAdapter myPageAdapter;

    @Override
    protected void onResume() {
        super.onResume();
        for (int i = 0; i < myPageAdapter.getCount(); i++) {
            tabHost.addTab(tabHost.newTab().setText(myPageAdapter.getPageTitle(i)).setTabListener(this));
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_front_page_);
        storageUtil = new StorageUtil(this);
        storageUtil.setUserStatus(1);
        user = storageUtil.getUser();
        toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);
        ActionBar actionBar = getSupportActionBar();
        if (user != null)
            actionBar.setTitle("Welcome " + user.getName());
        mPager = (ViewPager) findViewById(R.id.pager);
        tabHost = (MaterialTabHost) findViewById(R.id.materialTabHost);
        mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                tabHost.setSelectedNavigationItem(position);
            }
        });
        myPageAdapter = new MyPageAdapter(getSupportFragmentManager());
        mPager.setAdapter(myPageAdapter);
        /*for (int i = 0; i < myPageAdapter.getCount(); i++) {
            tabHost.addTab(tabHost.newTab().setText(myPageAdapter.getPageTitle(i)).setTabListener(this));
        }*/
        mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if (position == 0) {
                } else if (position == 1) {

                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    @Override
    public void onTabSelected(MaterialTab tab) {
        mPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabReselected(MaterialTab tab) {

    }

    @Override
    public void onTabUnselected(MaterialTab tab) {

    }

    class MyPageAdapter extends FragmentPagerAdapter {
        String tabs[] = getResources().getStringArray(R.array.tabs);

        public MyPageAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return tabs[position];
        }

        @Override
        public Fragment getItem(int position) {
            return setFragment(position);
        }

        @Override
        public int getCount() {
            return 3;
        }
    }

    private Fragment setFragment(int number) {
        if (number == 0) {
            Chats chats = new Chats();
            return chats;
        } else if (number == 1) {
            Request frag = new Request();
            return frag;
        } else {
            Invite frag = new Invite();
            return frag;
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.chatting_activity, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.logout:
                storageUtil.clear();
                startActivity(new Intent(this, MainActivity.class));
                break;
        }
        return super.onOptionsItemSelected(item);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        moveTaskToBack(true);
    }
}

Solution

  • First off, this could be a bit tough, one approach has people different result also, yet there are eventually some ways to put on test.

    One approach I usually used is to override the getItemPosition.

    In your custome adapter (MyPageAdapter ), override getItemPosition like so:

    class MyPageAdapter extends FragmentPagerAdapter {
     ...
      @Override
          public int getItemPosition(Object object) {
             if (object instanceof Chats ) {
                ((Chats )object).updateMyLogicOrView();
             }
             if (object instanceof Request) {
                ((Request)object).updateMyLogicOrView();
             }
    
         if (object instanceof Invite) {
                ((Invite)object).updateMyLogicOrView();
             }
             return super.getItemPosition(object);
          }
    ..
    }
    

    Then on each fragment which belongs to its own tab, You create updateMyLogicOrView(). In the method, you put down some operations you want that supposedly to generate new data / update data on the view. When you move to a tab, this updateMyLogicOrView() will always be invoked through the overriden method.

    // put this method on each fragment class
    public void updateMyLogicOrView(){
     // do some logics here..
    // like component.setText()
    // or, adding some new elements to adapter..
    
    }