1

I have a FragmentStatePagerAdapter where I want to display one and the same fragment multiple times.Because this fragment consist of a lot of views I'm looking for a way no to create that fragment every time user swipes occurs I just want to reload the data. What I try to achieve is display data by day from my DB.The problem is in my adapter code

public class MainViewPagerAdapter extends FragmentStatePagerAdapter {

    private String[] titles;

    private int currentPossition;

    public MainViewPagerAdapter(final FragmentManager fragManager, final String[] titles) {
        super(fragManager);
        this.titles = titles;
    }
    private static final int MAX_ITEMS = 400;
    @Override
    public Fragment getItem(final int position) {
        Calendar cal = Calendar.getInstance();

        cal.setTimeInMillis(System.currentTimeMillis());
        if (position < 200) {
            cal.add(Calendar.DAY_OF_YEAR, -1);
        } else if (position > 200) {
            cal.add(Calendar.DAY_OF_YEAR, 1);
        }
        return HomeFragment.getInstance(cal.getTimeInMillis());
    }

    /** Return the max items */
    @Override
    public int getCount() {
        return MAX_ITEMS;
    }

    @Override
    public CharSequence getPageTitle(final int position) {
        String title = "";
        if (position < currentPossition) {
            title = titles[0];
        } else if (position == currentPossition) {
            title = titles[1];
        } else { // else if (position > currentPossition
            title = titles[2];
        }
        return title;
    }

    /** Set the titles */
    public void setTitles(final String[] titles) {
        this.titles = titles;
    }

    /** Set the current position */
    public void setCurrentPossition(final int currentPossition) {
        this.currentPossition = currentPossition;
    }

    @Override
    public int getItemPosition(Object object) {
        if (object instanceof HomeFragment) {
            ((HomeFragment) object).changeMainScreen(DateManager.INSTANCE.getDateSetted());
        }
        return super.getItemPosition(object);
    }
}

For completeness here is the class that call my adapter

public class MainScreenHolder extends Fragment {

    private static Resources res;

    private static final int START_POINT = 200;

    public static ViewPager pager;

    private MainViewPagerAdapter adapter;

    private static String[] titles = new String[3];

    private static int currentPosition = START_POINT;

    /** Creates and returns the view hierarchy associated with the fragment. */
    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container,
            final Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.food_tabs_container, container, false);
        pager = (ViewPager) view.findViewById(R.id.pager);
        pager.setId(R.id.pager);

        titles = initTitles(0);
        adapter = new MainViewPagerAdapter(getChildFragmentManager(), titles);
        adapter.setCurrentPossition(START_POINT);
        pager.setAdapter(adapter);
        pager.setCurrentItem(START_POINT);

        pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(final int position) {
                final OnRefreshListener fragment = (OnRefreshListener) adapter.instantiateItem(pager,
                        position);

                adapter.setCurrentPossition(position);
                adapter.setTitles(setTitles(position));

                if (fragment != null) {
                    fragment.onRefresh();
                }
            }

            @Override
            public void onPageScrollStateChanged(final int state) {
                // nothing
            }

            @Override
            public void onPageScrolled(final int position, final float positionOffset,
                    final int positionOffsetPixels) {
                // nothing
            }
        });
        return view;
    }

    /** Called to do initial creation of a fragment */
    @Override
    public void onCreate(final Bundle savedState) {
        super.onCreate(savedState);
        res = getResources();
    }

    private String[] setTitles(final int position) {
        if (currentPosition < position) {
            titles[0] = titles[1];
            titles[1] = titles[2];
            DateManager.INSTANCE.addDays(2);
            titles[2] = Utility.dateAsString(DateManager.INSTANCE.getDateSettedCal(), res);
            DateManager.INSTANCE.addDays(-1);
        } else if (currentPosition > position) {
            DateManager.INSTANCE.addDays(-2);
            titles[2] = titles[1];
            titles[1] = titles[0];
            titles[0] = Utility.dateAsString(DateManager.INSTANCE.getDateSettedCal(), res);
            DateManager.INSTANCE.addDays(1);
        }
        currentPosition = position;
        return titles;
    }

    /** Set initial value for titles */
    public static String[] initTitles(final int offset) {
        titles[1] = Utility.dateAsString(DateManager.INSTANCE.getDateSettedCal(), res);
        DateManager.INSTANCE.addDays(1);
        titles[2] = Utility.dateAsString(DateManager.INSTANCE.getDateSettedCal(), res);
        DateManager.INSTANCE.addDays(-2);
        titles[0] = Utility.dateAsString(DateManager.INSTANCE.getDateSettedCal(), res);
        DateManager.INSTANCE.addDays(1);
        currentPosition = START_POINT + offset;
        return titles;
    }
}

Note:My code works but I want to improve the performance.
My start position is 200 so user can swipe 200 days backwards and 200 day forward.
Is there a way not creating new fragment over and over again when swipe happens.

Radoslav
  • 1,446
  • 1
  • 16
  • 30

1 Answers1

0

I never have used FragmentStatePagerAdapter but I am interested in this issue. Try this, override the method instantiateItem() in MainViewPagerAdapter to control the returned view or Fragment, in your case. Sample code:

@Override
public Object instantiateItem(ViewGroup container, int position) {
   return HomeFragment;
}

I assume object HomeFragment is already defined since I don't see the code for it.

The Original Android
  • 6,147
  • 3
  • 26
  • 31
  • It is a separate class (Fragment) that display DB data by day in listview and more. What I do is when user scroll forward or backword I load data for that day. I'll try your suggestion later today after work... – Radoslav Dec 14 '15 at 08:05