Can I use view pager with views (not with fragments)

前端 未结 7 1975
情深已故
情深已故 2020-11-28 01:39

I am using ViewPager for swiping between Fragments, but can I use ViewPager to swipe between Views simple XML layout?

7条回答
  •  一生所求
    2020-11-28 02:29

    Based on the previous answers, I made the following class to achieve that in a proper and clearest way (I hope):

    public class MyViewPagerAdapter extends PagerAdapter {
    
        ArrayList views;
        LayoutInflater inflater;
    
        public MyViewPagerAdapter(ActionBarActivity ctx){
            inflater = LayoutInflater.from(ctx);
            //instantiate your views list
            views = new ArrayList(5);
        }
    
        /**
         * To be called by onStop
         * Clean the memory
         */
        public void release(){
         views.clear();
            views = null;
        }
    
        /**
         * Return the number of views available.
         */
        @Override
        public int getCount() {
            return 5;
        }
    
        /**
         * Create the page for the given position. The adapter is responsible
         * for adding the view to the container given here, although it only
         * must ensure this is done by the time it returns from
         * {@link #finishUpdate(ViewGroup)}.
         *
         * @param container The containing View in which the page will be shown.
         * @param position The page position to be instantiated.
         * @return Returns an Object representing the new page. This does not
         *         need to be a View, but can be some other container of
         *         the page.  ,container
         */
        public Object instantiateItem(ViewGroup container, int position) {
            ViewGroup currentView;
            Log.e("MyViewPagerAdapter", "instantiateItem for " + position);
            if(views.size()>position&&views.get(position) != null){
                Log.e("MyViewPagerAdapter",
                      "instantiateItem views.get(position) " +
                      views.get(position));
                currentView = views.get(position);
            }
            else{
                Log.e("MyViewPagerAdapter", "instantiateItem need to create the View");
                int rootLayout = R.layout.view_screen;
                currentView = (ViewGroup) inflater.inflate(rootLayout, container, false);
    
                ((TextView)currentView.findViewById(R.id.txvTitle)).setText("My Views " + position);
                ((TextView)currentView.findViewById(R.id.btnButton)).setText("Button");
                ((ImageView)currentView.findViewById(R.id.imvPicture)).setBackgroundColor(0xFF00FF00);
            }
            container.addView(currentView);
            return currentView;
        }
    
        /**
         * Remove a page for the given position. The adapter is responsible
         * for removing the view from its container, although it only must ensure
         * this is done by the time it returns from {@link #finishUpdate(ViewGroup)}.
         *
         * @param container The containing View from which the page will be removed.
         * @param position The page position to be removed.
         * @param object The same object that was returned by
         * {@link #instantiateItem(View, int)}.
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View)object);
    
        }
    
        /**
         * Determines whether a page View is associated with a specific key object
         * as returned by {@link #instantiateItem(ViewGroup, int)}. This method is
         * required for a PagerAdapter to function properly.
         *
         * @param view   Page View to check for association with object
         * @param object Object to check for association with view
         * @return true if view is associated with the key object object
         */
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view==((View)object);
        }
    }
    

    And you have to set it in your activity:

    public class ActivityWithViewsPaged extends ActionBarActivity {
    
        /**
         * The page Adapter: Manage the list of views (in fact here, its fragments)
         * And send them to the ViewPager
         */
        private MyViewPagerAdapter pagerAdapter;
    
        /**
         * The ViewPager is a ViewGroup that manage the swipe from left
         * to right to left.
         * Like a listView with a gesture listener...
         */
        private ViewPager viewPager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_with_views);
    
            // Find the viewPager
            viewPager = (ViewPager) super.findViewById(R.id.viewpager);
    
            // Instantiate the PageAdapter
            pagerAdapter = new MyViewPagerAdapter(this);
    
            // Affectation de l'adapter au ViewPager
            viewPager.setAdapter(pagerAdapter);
            viewPager.setClipToPadding(false);
            viewPager.setPageMargin(12);
    
            // Add animation when the page are swiped
            // this instanciation only works with honeyComb and more
            // if you want it all version use AnimatorProxy of the nineoldAndroid lib
            //@see:http://stackoverflow.com/questions/15767729/backwards-compatible-pagetransformer
            if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){
                viewPager.setPageTransformer(true, new PageTransformer());
            }
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            pagerAdapter.release();
        }
    

    Where the XML files are obvious view_screen.xml:

    
    
    
     
        
            
            
            
        
        

    And ActivtyMain has the following layout:

    
    
    
    
    

    Big thanks to Brian and Nicholas for your answer, I hope I add some clearest information and hightlight some good practices for this feature.

提交回复
热议问题