Infinite Scrolling Image ViewPager

后端 未结 7 813
Happy的楠姐
Happy的楠姐 2020-11-27 17:33

As documented by Google, the Gallery class was deprecated in API level 16. This widget is no longer supported. Other horizontally scrolling widgets include HorizontalScrollV

7条回答
  •  春和景丽
    2020-11-27 17:56

    I think my solution is simpler.

    Attention to my array of images structure:

    Item 0          => last image
    
    Item count()-1  => first image
    

    The trick is on onPageScrollStateChanged:

    When user scrolls to last item -> the pager jumps without animation to first image (position = 1)

    When user scrolls to first item -> the pager jumps without animation to last image (position = count - 2)

    public class InfiniteScrollingActivity extends ActionBarActivity {
    
        private ViewPager     pager;
        private MyAdapter     adapter;
        int[] promoImageIds = new int[]{R.drawable.cover6, R.drawable.cover1, R.drawable.cover2, R.drawable.cover3, R.drawable.cover4, R.drawable.cover5, R.drawable.cover6, R.drawable.cover1 };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my_test);
    
            adapter = new MyAdapter(getSupportFragmentManager(), promoImageIds);
            pager = (ViewPager)findViewById(R.id.pager);
            pager.setAdapter(adapter);
            pager.setCurrentItem( 1 );
            pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageSelected(int index) {
                    Log.v( "onPageSelected", String.valueOf( index ) );
                }
    
                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                    // Log.v("onPageScrolled", "");
                }
    
                @Override
                public void onPageScrollStateChanged(int state) {
                    Log.v("onPageScrollStateChanged", String.valueOf(state));
    
                    if (state ==ViewPager.SCROLL_STATE_IDLE) {
                        int index = pager.getCurrentItem();
                        if ( index == 0 )
                            pager.setCurrentItem( adapter.getCount() - 2, false );
                        else if ( index == adapter.getCount() - 1 )
                            pager.setCurrentItem( 1 , false);
                    }
                }
            });
        }
    
    
        public static class MyAdapter extends FragmentPagerAdapter {
    
            int[] promoImageIds;
    
            public MyAdapter(FragmentManager fm, int[] promoImageIds){
                super(fm);
                this.promoImageIds = promoImageIds;
            }
    
            @Override
            public int getCount(){
                return promoImageIds.length;
            }
    
            @Override
            public Fragment getItem(int position) {
    
                return PromoFragment.newInstance( promoImageIds[position] );
            }
        }
    
        public static class PromoFragment extends Fragment
        {
            int imageID;
    
    
            static PromoFragment newInstance( int imageID)
            {
                PromoFragment f = new PromoFragment();
    
                // Supply num input as an argument.
                Bundle args = new Bundle();
                args.putInt( "imageID", imageID );
                f.setArguments(args);
    
                return f;
            }
    
            @Override
            public void onCreate(Bundle savedInstanceState)
            {
                super.onCreate(savedInstanceState);
                imageID = getArguments() != null ? getArguments().getInt( "imageID" ) : null;
            }
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState)
            {
                ImageView v = (ImageView) inflater.inflate(R.layout.fragment_image, container, false);
                v.setImageResource( imageID );
                return v;
            }
        }
    }
    

提交回复
热议问题