1

I am using view pager in activity and the sequence is - when I click the next button in first page, it should go to the second page. If I click the button in second page, it should go to third and so on. But my current app is behaving weird, i.e, When I click next button in second page, it goes to fourth page. Once again when I click first button in first page, it jumps to third page and so on..

Here is code.

public class ViewPagerActivity extends AppCompatActivity {
    private ViewPager pager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.viewpager_act);
        setViewPager();

        /*pager.setPageTransformer(true, new ZoomPageTransformer());

        pager.setAdapter(new MyViewPagerAdapter(getSupportFragmentManager()));
        pager.post(new Runnable() {
            @Override
            public void run() {
                pager.setCurrentItem(position); //don't know how to use this from fragment
            }
        });*/
    }

    private void setViewPager() {
        pager = (ViewPager) findViewById(R.id.viewPager);
        FragmentManager fm = getSupportFragmentManager();
        ViewPagerAdapter adapter = new ViewPagerAdapter(fm);
        pager.setAdapter(adapter);

    }

    public void setCurrentItem(int selectedPosition) {
        pager.setCurrentItem(selectedPosition, true);
    }

    private class ViewPagerAdapter extends FragmentPagerAdapter {
        public ViewPagerAdapter(FragmentManager supportFragmentManager) {
            super(supportFragmentManager);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return FirstPager.newInstance();
                case 1:
                    return SecondPager.newInstance();
                case 2:
                    return ThirdPager.newInstance();
                case 3:
                    return FourthPager.newInstance();
                case 4:
                    return FifthPager.newInstance();
                case 5:
                    return SixthPager.newInstance();
                default:
                    return null;
            }

        }

        @Override
        public int getCount() {
            return 6;
        }
    }

FirstPager:

public class FirstPager extends Fragment {
    private ImageView slideArrow;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.first_pager, container, false);
        return v;
    }

    public static FirstPager newInstance() {
        FirstPager fragment = new FirstPager ();
        return fragment;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initUI();
    }

    private void initUI() {
        slideArrow = (ImageView) getActivity().findViewById(R.id.next_arrow);
        slideArrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ViewPagerActivity)getActivity()).setCurrentItem (1);
            }
        });
    }
}

Similarly in other fragments, I gave currentItem as 2,3,4,5 and 6. But it’s position behavior is not correct.

I referred some post but how in my case, how I will apply for a method to pass from fragment to make the position to work correctly?

Community
  • 1
  • 1
Shadow
  • 6,864
  • 6
  • 44
  • 93

4 Answers4

3

I think the best approach would be this:

  viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
Abhi
  • 2,115
  • 2
  • 18
  • 29
1
slideArrow = (ImageView) getActivity().findViewById(R.id.next_arrow);

Are you sure, you're calling this correctly? You're not.

You're calling findViewById of the arrow inside your activity. A ViewPager works by loading this page, and pre-loading next and previous pages for smooth swipe. And when you click the button on your 1st page, the last loaded page's (in your case 2nd page's) button click event gets called.

You must use the arrow button in each of your fragments

You can do something like this:

public class FirstPager extends Fragment {
    private ImageView slideArrow;
    View v;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.first_pager, container, false);
        return v;
    }

    public static FirstPager newInstance() {
        FirstPager fragment = new FirstPager ();
        return fragment;
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        initUI();
    }

    private void initUI() {
        slideArrow = (ImageView) v.findViewById(R.id.next_arrow); // Note the difference in this line.
        slideArrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((ViewPagerActivity)getActivity()).setCurrentItem (1);
            }
        });
    }
}
Drunken Daddy
  • 7,326
  • 14
  • 70
  • 104
0

You can do two things here:

  • Firstly,Your viewpager has a override method onPageSelected() which return the select page positon. using this poistion element get the view and bind your button there and write listener there itself and write viewpager.setCurrentItem(i++); //if i is ur current position,but be sure to check if it is the last item.
  • secondly,you hold the position of the current fragment and
     ((ViewPagerActivity)getActivity()).setCurrentItem (next_frag_pos);
    

Rushi Ayyappa
  • 2,708
  • 2
  • 16
  • 32
0

This code try working perfect.

public class ViewPagerActivity extends FragmentActivity {

private ViewPager pager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.viewpager_act);
    setViewPager();

    /*pager.setPageTransformer(true, new ZoomPageTransformer());

    pager.setAdapter(new MyViewPagerAdapter(getSupportFragmentManager()));
    pager.post(new Runnable() {
        @Override
        public void run() {
            pager.setCurrentItem(position); //don't know how to use this from fragment
        }
    });*/
}

private void setViewPager() {
    pager = (ViewPager) findViewById(R.id.viewPager);
    FragmentManager fm = getSupportFragmentManager();
    ViewPagerAdapter adapter = new ViewPagerAdapter(fm);
    pager.setAdapter(adapter);

}

public void setCurrentItem(int selectedPosition) {
    pager.setCurrentItem(selectedPosition, true);
}
private class ViewPagerAdapter extends FragmentPagerAdapter {
    public ViewPagerAdapter(FragmentManager supportFragmentManager) {
        super(supportFragmentManager);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new FirstPager();
            case 1:
                return new SecondPager();
            case 2:
                return new ThirdPager();
            case 3:
                return new FourthPager();
            case 4:
                return new FifthPager();
            case 5:
                return new SixthPager();
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return 6;
    }
}

}

Deep
  • 162
  • 7