0

For example, I have

MainActivity (contain a ViewPager)
  Fragment0
  Fragment1 (contain a ViewPager)
          Fragment1a
          Fragment1b
  Fragment2

I want to refresh Fragment1a every time it visible so I use setUserVisibleHint inside Fragment1a but not working well.

When I switch between fragment Fragment1a and Fragment1b, setUserVisibleHint of Fragment1a called
However when I go from fragment Fragment0 to Fragment1 or Fragment2 to Fragment1 setUserVisibleHint of Fragment1a (and Fragment1b) not called

How can I detect Fragment1a (and Fragment1b) visible? Any help or suggestion would be great appreciated.

Linh
  • 57,942
  • 23
  • 262
  • 279

1 Answers1

2

setUserVisibleHint also not working me I used another way to update data in fragment when view pager change fragment, Below is The way,

 viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                }

                @Override
                public void onPageSelected(int position) {
                    try {
                        if(viewPagerAdapter.getItem(position) instanceof Fragment1a){
                            Fragment1a frag1 = (Fragment1a) viewPagerAdapter.getItem(position);
                            frag1.updateData(data); // here is the public method of fragment which declared for udpate data in fragment
                        }else if(viewPagerAdapter.getItem(position) instanceof Fragment1b){
                            Fragment1b frag2 = (Fragment1b) viewPagerAdapter.getItem(position);
                            frag2.updateData(data); // here is the public method of fragment which declared for udpate data in fragment
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onPageScrollStateChanged(int state) {
                }
            });
viewpager.setCurrentItem(0);

This way you can update data directly Just you need to create one public method in your fragment.

Here is the Adapter

class ViewPagerAdapter extends FragmentPagerAdapter {
        private final List<Fragment> mFragmentList = new ArrayList<>();
        private final List<TabModel> mFragmentTitleList = new ArrayList<>();

        public ViewPagerAdapter(FragmentManager manager) {
            super(manager);
        }

        @Override
        public Fragment getItem(int position) {
            return mFragmentList.get(position);
        }

        @Override
        public int getCount() {
            return mFragmentList.size();
        }

        public void addFragment(Fragment fragment, TabModel title) {
            mFragmentList.add(fragment);
            mFragmentTitleList.add(title);
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return mFragmentTitleList.get(position).getTabName();
        }

    }
Dhaval Solanki
  • 4,589
  • 1
  • 23
  • 39
  • inside `getItem()` of `ViewPager` adapter, I always create new `Fragment`. Example, `public Fragment getItem(int position) { if (position == 0) { return new Fragment1a(); } return new Fragment1b(); }`. Therefore, anytime I call getItem, new fragment will create – Linh Aug 23 '17 at 05:52
  • 1
    Okay, Then its may be causing problem you need to define array for that. – Dhaval Solanki Aug 23 '17 at 05:59
  • I found a problem, `onPageSelected` not call when I go from `Fragment0` to `Fragment1` – Linh Aug 23 '17 at 06:14
  • Are you using PageIndicator for ViewPager? – Dhaval Solanki Aug 23 '17 at 06:20
  • After registering listener you need to call first time viewpager.setCurrentItem(0); – Dhaval Solanki Aug 23 '17 at 06:25