ViewPager setCurrentItem(pageId, true) does NOT smoothscroll

前端 未结 13 1148
予麋鹿
予麋鹿 2020-12-02 13:01

I am compiling on SDK 4.03, Samsung Infuse Android 2.2, Support Library for Android 4, and using ViewPager in my app, actual swipe works fine, but when I do



        
13条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-02 13:49

    I´ve created this class because I wasn't fully satisfied with the above solutions

    The class overrides setCurrentItem(int item, boolean smoothScroll) and uses reflection to keep this method as original as possible. The key is that velocity is not 0. You only have to replace your current ViewPager with this MyViewPager class and use it like normally:

    import android.content.Context;
    import android.util.AttributeSet;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    import androidx.viewpager.widget.ViewPager;
    
    public class MyViewPager extends ViewPager {
    
        public MyViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        /**
         * Set the currently selected page. If the ViewPager has already been through its first
         * layout with its current adapter there will be a smooth animated transition between
         * the current item and the specified item.
         *
         * @param item         Item index to select
         * @param smoothScroll True to smoothly scroll to the new item, false to transition immediately
         */
        @Override
        public void setCurrentItem(int item, boolean smoothScroll) {
            final Class viewpager = ViewPager.class;
            int velocity = 1;
    
            try {
                Field mPopulatePending = viewpager.getDeclaredField("mPopulatePending");
                mPopulatePending.setAccessible(true);
                mPopulatePending.set(this, false);
    
                Method setCurrentItemInternal = viewpager.getDeclaredMethod("setCurrentItemInternal", int.class, boolean.class, boolean.class, int.class);
                setCurrentItemInternal.setAccessible(true);
                setCurrentItemInternal.invoke(this, item, smoothScroll, false, velocity);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

提交回复
热议问题