Nitin4Android
Nitin4Android

Reputation: 864

How to find currently visible fragments in a viewpager while showing multiple fragments at once

I am building an App in which multiple fragments are shown at once using ViewPager and FragmentStatePagerAdapter. Below is what I am doing:

ScreenShot of ViewPager

public class PageViewActivity extends FragmentActivity {
    protected static final String TAG = "PageViewActivity";
    MyPageAdapter pageAdapter;
    private List<Fragment> fragments;
    private FragmentManager fragmentManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_page_view);

        fragments = getFragments();

        fragmentManager = getSupportFragmentManager();

        pageAdapter = new MyPageAdapter(fragmentManager, fragments);

        ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
        pager.setAdapter(pageAdapter);
        pager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                Log.i(TAG, "Inside onPageSelected....................... "
                        + position);
                ((MyFragment) pageAdapter.getChildAt(position)).updateView();
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                Log.i(TAG, "Inside onPageScrolled... " + arg0);
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                Log.i(TAG, "Inside onPageScrollStateChanged... " + arg0);
            }
        });
    }

    private List<Fragment> getFragments() {
        List<Fragment> fList = new ArrayList<Fragment>();

        fList.add(MyFragment.newInstance("Fragment 1"));
        fList.add(MyFragment.newInstance("Fragment 2"));
        fList.add(MyFragment.newInstance("Fragment 3"));
        fList.add(MyFragment.newInstance("Fragment 4"));
        fList.add(MyFragment.newInstance("Fragment 5"));
        fList.add(MyFragment.newInstance("Fragment 6"));
        fList.add(MyFragment.newInstance("Fragment 7"));

        return fList;
    }

    private class MyPageAdapter extends FragmentStatePagerAdapter {
        private List<Fragment> fragments;

        public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
            super(fm);
            this.fragments = fragments;
        }

        public void setList(List<Fragment> fragments) {
            this.fragments = fragments;
            notifyDataSetChanged();
        }

        @Override
        public Fragment getItem(int position) {
            Log.i(TAG, "Inside getItem............");
            return this.fragments.get(position);
        }

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

        @Override
        public float getPageWidth(int position) {
            if (position == 0) {
                return 0.4f;
            } else {
                return 0.3f;
            }
        }

        public Fragment getChildAt(int position) {
            return this.fragments.get(position);
        }

        @Override
        public int getItemPosition(Object object) {
            Log.i(TAG, "getItemPosition..........");
            if (fragments.contains(object)) {
                Log.i(TAG,
                        "fragmentList.contains(object)... " + object.toString());
                return POSITION_UNCHANGED;
            }
            return POSITION_NONE;
        }

                    }
    }
}

My Question is how to find which fragments are visible?? (eg Fragment 1, 2 and 3 from screen shot)

I know abot pager.setOnPageChangeListener and Fragment.setUserVisibleHint(boolean isVisibleToUser) but of no use to me :-(

Your help is very appreciated. Thanks!!!

Upvotes: 1

Views: 3665

Answers (4)

stefan
stefan

Reputation: 1376

I do:

 for (Fragment frag : getSupportFragmentManager().getFragments()) {
                if (frag instanceof LogbookFragment) {
                    LogbookFragment logFrag = (LogbookFragment) frag;
                    if (logFrag.getUserVisibleHint()) {
                        createDocument(logFrag.data.Trips, sp_swipeType.getSelectedItemPosition(), logFrag._dtStart);
                        break;
                    }
                }
            }

Upvotes: 0

Zeeshan
Zeeshan

Reputation: 1655

this link might be helpful

use this line of code Fragment fr = getSupportFragmentManager().findFragmentByTag(“android:switcher:” + R.id.pager + “:” + mViewPager.getCurrentItem());

Upvotes: 2

Erik
Erik

Reputation: 5119

Look at this two working Solutions

Also look at this

Since your storing your fragment in the private List<Fragment> fragments; you could let the Fragments tell you about each Fragment visibility state. In the Fragment, After the onStart() is called the Fragment is visible to the user. Just iterate all fragment in your List and ask them using a boolean visible/notVisible

Upvotes: 0

Abhimaan
Abhimaan

Reputation: 1911

This could be a possible solution

Hint

  1. Write a function in your adapter which takes integer(ie getCurrentItem selected function output of the adapter).
  2. Using that position check the fragments visibility on either side of the adapter.

    Example: ie current position is 3 and you are displaying 3 fragment at a time then check fragments in position 2,1 and 4,5 for there visibility using the method getUserVisibleHint().

  3. store the positions of the fragment which is visible and return it in an array

Hope this helps

Upvotes: 0

Related Questions