0

I am trying to create an activity to manage the dynamic creation of Fragments in a ViewPager ... the problem is that I'm having problems to manage them.

The Fragments should be created at the start of the activity and if I swipe Left or Right, it will not create them for a second time but show me the correct one.

package info.androidhive.materialdesign.activity;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

import info.androidhive.materialdesign.R;
import info.androidhive.materialdesign.utility.MyDataContainer;
import xdroid.toaster.Toaster;


public class ScreenSlidePagerActivity extends Fragment {
    /**
     * The number of pages (wizard steps) to show in this demo.
     */
    public int NUM_PAGES = MyDataContainer.getNumberOfStreets(MyDataContainer.allStreets) + 1;
    static int mPageLastScreen=0;
    static int currentPage = 0 ;
    /**
     * The pager widget, which handles animation and allows swiping horizontally to access previous
     * and next wizard steps.
     */
    private ViewPager mPager;
    private List<Fragment> fragments = new ArrayList<Fragment>();

    /**
     * The pager adapter, which provides the pages to the view pager widget.
     */
    private ViewPagerAdapter mPagerAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_screen_slide);
        for(int x = 0; x < NUM_PAGES ; x++) {
            fragments.add(new ScreenSlidePageFragment());
        }
    }

    public void onResume(){
        super.onResume();
        if (!(mPagerAdapter == null)) {

            mPagerAdapter.notifyDataSetChanged();


        }
    }


    public void onViewCreated(View v,Bundle savedInstanceState){
        super.onViewCreated(v, savedInstanceState);
        mPager = (ViewPager) v.findViewById(R.id.pager);
        mPagerAdapter = new ViewPagerAdapter(getFragmentManager(),fragments);
        mPager.setAdapter(mPagerAdapter);
        mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            private float thresholdOffset = 0.5f;
            private boolean firstPlus = true;
            private boolean firstMinus = true;
            public void onPageScrollStateChanged(int state)
            {}
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
            {

                if(mPageLastScreen!=position)
                {
                    if (thresholdOffset > positionOffset) {
                        Toaster.toast("Page has been Scrolled left " + currentPage);
                        if (firstPlus){
                            firstPlus = false;
                        }
                        else {
                            currentPage++;
                            firstMinus = true;
                        }
                        MyDataContainer.currentView = currentPage;
                        Toaster.toast("currentView " + MyDataContainer.currentView);

                    } else {
                        Toaster.toast("Page has been Scrolled right, current page : " + currentPage );
                        if (firstMinus){
                            firstMinus = false;
                        }
                        else {
                            currentPage--;
                            firstPlus = true;
                        }
                        MyDataContainer.currentView = currentPage;
                        Toaster.toast("currentView " + MyDataContainer.currentView);

                    }
                    mPageLastScreen=position;
                }
            }

            public void onPageSelected(int position)
            {}
        });
    }


    /**
     * A simple pager adapter that represents 5 ScreenSlidePageFragment objects, in
     * sequence.
     */

    public class ViewPagerAdapter extends FragmentPagerAdapter
    {
        private List<Fragment> fragments;

        /**
         * @param fm
         * @param fragments
         */
        public ViewPagerAdapter(FragmentManager fm, List<Fragment> fragments) {
            super(fm);
            this.fragments = fragments;
        }

/* (non-Javadoc)
 * @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
 */

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

/* (non-Javadoc)
 * @see android.support.v4.view.PagerAdapter#getCount()
 */

        @Override
        public int getCount() {

            return this.fragments.size() - 1;
        }

        @Override
        public int getItemPosition(Object object) {
            Toaster.toast("I want number : " + currentPage + " " + MyDataContainer.currentView);

            return MyDataContainer.currentView;
        }
    }




    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

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

        @Override
        public int getCount() {

            return NUM_PAGES;
        }
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.activity_screen_slide, container, false);
        // Inflate the layout for this fragment
        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }
}

This Code creates only 3 fragments at a time and when you swipe to other one, it will delete one of the three you load before and add the Fragment it has just created.

Below is my code :

public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
            {

                if(mPageLastScreen!=position)
                {
                    if (thresholdOffset > positionOffset) {
                        Toaster.toast("Page has been Scrolled left " + currentPage);
                        if (firstPlus){
                            firstPlus = false;
                        }
                        else {
                            currentPage++;
                            firstMinus = true;
                        }
                        MyDataContainer.currentView = currentPage;
                        Toaster.toast("currentView " + MyDataContainer.currentView);

                    } else {
                        Toaster.toast("Page has been Scrolled right, current page : " + currentPage );
                        if (firstMinus){
                            firstMinus = false;
                        }
                        else {
                            currentPage--;
                            firstPlus = true;
                        }
                        MyDataContainer.currentView = currentPage;
                        Toaster.toast("currentView " + MyDataContainer.currentView);

                    }
                    mPageLastScreen=position;
                }
            }

This part of code set the current Fragment which you are looking .

lukkea
  • 3,606
  • 2
  • 37
  • 51

0 Answers0