3

I came across a strange issue in my project.

I have implemented infinite viewpager adapter using FragmentStatePagerAdapter

Code for same is:

public class DashBoardAdapter extends FragmentStatePagerAdapter {

    ArrayList<AbstractFragment> fragments;

    private int MAXFRAGMENTS=0;

    public DashBoardAdapter(FragmentManager fm, ArrayList<AbstractFragment> fragments) {
        super(fm);
        this.fragments = fragments;
        MAXFRAGMENTS=fragments.size();
    }

    @Override
    public AbstractFragment getItem(int position) {
        return fragments.get(position%MAXFRAGMENTS);
    }


    @Override
    public int getCount() {
        return Integer.MAX_VALUE;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return fragments.get(position%MAXFRAGMENTS).getTitle();
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        int virtualPosition = position % MAXFRAGMENTS;
        return super.instantiateItem(container, virtualPosition);
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        int virtualPosition = position % MAXFRAGMENTS;
        super.destroyItem(container, virtualPosition, object);
    }

    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
        MAXFRAGMENTS = fragments.size();
    }
}

And the Main Activitycode(Function only) is something like this:

public void initializeViewPager()
    {

        verticalViewPager = (VerticalViewPager) findViewById(R.id.verticalviewpager);
        enabledPages=new ArrayList<>();
        enabledPages.addAll(getEnabledPages(false));
        adapter=new DashBoardAdapter(getSupportFragmentManager(),enabledPages);
        verticalViewPager.setAdapter(adapter);
        verticalViewPager.setPageTransformer(true, new PageTransformer());
        verticalViewPager.setCurrentItem(999+position);
        verticalViewPager.setOffscreenPageLimit(1);

        verticalViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                if(adapter!=null)
                    title.setText(adapter.getPageTitle(position));
            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    private ArrayList<AbstractFragment> getEnabledPages(boolean a)
    {
        ArrayList<AbstractFragment> fragments=new ArrayList<>();
        fragments.add(FragmentAttendance.newInstance(fragments.size()));
        fragments.add(FragmentCompensation.newInstance(fragments.size()));
        if(a)
            fragments.add(FragmentTimeOff.newInstance(fragments.size()));
        if(a)
         fragments.add(FragmentCalendar.newInstance(fragments.size()));
        if(a)
            fragments.add(FragmentPeople.newInstance(fragments.size()));
        if(a)
            fragments.add(FragmentProvisions.newInstance(fragments.size()));

        position = fragments.size()-(999+position)%fragments.size();

        return fragments;
    }

Layout of activity contains just a Viewpager.

And the Fragments, I have used is just copy of below fragment with different names

public class FragmentAttendance extends AbstractFragment {
    public static final String ARG_SECTION_NUMBER = "section_number";
    String title ="Testing";
    public static FragmentAttendance newInstance(int sectionNumber) {
        FragmentAttendance fragment = new FragmentAttendance();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public FragmentAttendance() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.card_attendance, container, false);

        return rootView;
    }

    @Override
    public String getTitle() {
        return title;
    }
}

Layout of fragment has just LinearLayout with a TextView.

The code is running superb if I am adding fragments more than three fragments. Howsoever as soon as the number of added fragments gets below four. My code Works in strange behavior.

Some of errors are Fragment already initialised Other are Forward scrolling shows fragement View Howsoever when I scroll backward No view appears.

The working code can be tested by passing true to getEnabledPages(true); And the non working code can be tested by passing false to getEnabledPages(false);

Please someone help me in this strange behaviour.

Pradeep Kumar Kushwaha
  • 2,231
  • 3
  • 23
  • 34

0 Answers0