浏览代码

ViewPager2 instead ViewPager

zhpanvip 5 年之前
父节点
当前提交
c328416c8e

+ 2 - 3
app/src/main/java/com/example/zhpan/circleviewpager/activity/WelcomeActivity.kt

@@ -9,13 +9,12 @@ import android.view.animation.DecelerateInterpolator
 import android.widget.ImageView
 import android.widget.Toast
 import androidx.core.content.ContextCompat
+import androidx.viewpager2.widget.ViewPager2
 import com.example.zhpan.circleviewpager.R
 import com.example.zhpan.circleviewpager.bean.CustomBean
 import com.example.zhpan.circleviewpager.viewholder.CustomPageViewHolder
 import com.zhpan.bannerview.BannerViewPager
-import com.zhpan.bannerview.adapter.OnPageChangeListenerAdapter
 import com.zhpan.bannerview.constants.TransformerStyle
-import com.zhpan.bannerview.holder.HolderCreator
 import com.zhpan.bannerview.holder.HolderCreator2
 import com.zhpan.bannerview.utils.BannerUtils
 import com.zhpan.indicator.enums.IndicatorSlideMode
@@ -62,7 +61,7 @@ class WelcomeActivity : BaseDataActivity(), HolderCreator2<CustomPageViewHolder>
                         ContextCompat.getColor(this, R.color.white_alpha_75))
                 .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
                 .setIndicatorSliderRadius(resources.getDimension(R.dimen.dp_3).toInt(), resources.getDimension(R.dimen.dp_4_5).toInt())
-                .setOnPageChangeListener(object : OnPageChangeListenerAdapter() {
+                .setOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
                     override fun onPageSelected(position: Int) {
                         BannerUtils.log("position:$position")
                         updateUI(position)

+ 0 - 1
app/src/main/java/com/example/zhpan/circleviewpager/fragment/HomeFragment.java

@@ -21,7 +21,6 @@ import com.example.zhpan.circleviewpager.viewholder.NetViewHolder;
 import com.scwang.smartrefresh.header.MaterialHeader;
 import com.scwang.smartrefresh.layout.SmartRefreshLayout;
 import com.zhpan.bannerview.BannerViewPager;
-import com.zhpan.bannerview.adapter.OnPageChangeListenerAdapter;
 import com.zhpan.idea.net.common.ResponseObserver;
 import com.zhpan.idea.utils.LogUtils;
 import com.zhpan.idea.utils.RxUtil;

+ 42 - 54
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -27,7 +27,6 @@ import com.zhpan.bannerview.manager.BannerManager;
 import com.zhpan.bannerview.manager.BannerOptions;
 import com.zhpan.bannerview.transform.ScaleInTransformer;
 import com.zhpan.bannerview.utils.BannerUtils;
-import com.zhpan.bannerview.adapter.BannerPagerAdapter;
 import com.zhpan.bannerview.provider.ViewStyleSetter;
 import com.zhpan.indicator.IndicatorView;
 import com.zhpan.indicator.annotation.AIndicatorSlideMode;
@@ -36,7 +35,7 @@ import com.zhpan.indicator.base.IIndicator;
 
 import java.util.List;
 
-import static com.zhpan.bannerview.adapter.BannerPagerAdapter.MAX_VALUE;
+import static com.zhpan.bannerview.adapter.BaseBannerAdapter.MAX_VALUE;
 import static com.zhpan.bannerview.constants.IndicatorGravity.CENTER;
 import static com.zhpan.bannerview.constants.IndicatorGravity.END;
 import static com.zhpan.bannerview.constants.IndicatorGravity.START;
@@ -160,40 +159,48 @@ public class BannerViewPager<T, VH extends RecyclerView.ViewHolder> extends Rela
         return super.dispatchTouchEvent(ev);
     }
 
-    public void onPageSelected(int position) {
-        int size = mBannerPagerAdapter.getListSize();
-        currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, size);
-        if (size > 0 && isCanLoop() && position == 0 || position == MAX_VALUE - 1) {
-            setCurrentItem(currentPosition, false);
-        }
-        if (mOnPageChangeListener != null)
-            mOnPageChangeListener.onPageSelected(currentPosition);
-        if (mIndicatorView != null) {
-            mIndicatorView.onPageSelected(currentPosition);
+    private ViewPager2.OnPageChangeCallback mOnPageChangeCallback = new ViewPager2.OnPageChangeCallback() {
+        @Override
+        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
+            super.onPageScrolled(position, positionOffset, positionOffsetPixels);
+            int listSize = mBannerPagerAdapter.getListSize();
+            int realPosition = BannerUtils.getRealPosition(isCanLoop(), position, listSize);
+            if (listSize > 0) {
+                if (onPageChangeCallback != null) {
+                    onPageChangeCallback.onPageScrolled(realPosition, positionOffset, positionOffsetPixels);
+                }
+                if (mIndicatorView != null) {
+                    mIndicatorView.onPageScrolled(realPosition, positionOffset, positionOffsetPixels);
+                }
+            }
         }
-    }
 
-    public void onPageScrollStateChanged(int state) {
-        if (mIndicatorView != null) {
-            mIndicatorView.onPageScrollStateChanged(state);
-        }
-        if (mOnPageChangeListener != null) {
-            mOnPageChangeListener.onPageScrollStateChanged(state);
+        @Override
+        public void onPageSelected(int position) {
+            super.onPageSelected(position);
+            int size = mBannerPagerAdapter.getListSize();
+            currentPosition = BannerUtils.getRealPosition(isCanLoop(), position, size);
+            if (size > 0 && isCanLoop() && position == 0 || position == MAX_VALUE - 1) {
+                setCurrentItem(currentPosition, false);
+            }
+            if (onPageChangeCallback != null)
+                onPageChangeCallback.onPageSelected(currentPosition);
+            if (mIndicatorView != null) {
+                mIndicatorView.onPageSelected(currentPosition);
+            }
         }
-    }
 
-    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-        int listSize = mBannerPagerAdapter.getListSize();
-        int realPosition = BannerUtils.getRealPosition(isCanLoop(), position, listSize);
-        if (listSize > 0) {
-            if (mOnPageChangeListener != null) {
-                mOnPageChangeListener.onPageScrolled(realPosition, positionOffset, positionOffsetPixels);
-            }
+        @Override
+        public void onPageScrollStateChanged(int state) {
+            super.onPageScrollStateChanged(state);
             if (mIndicatorView != null) {
-                mIndicatorView.onPageScrolled(realPosition, positionOffset, positionOffsetPixels);
+                mIndicatorView.onPageScrollStateChanged(state);
+            }
+            if (onPageChangeCallback != null) {
+                onPageChangeCallback.onPageScrollStateChanged(state);
             }
         }
-    }
+    };
 
     private void handlePosition() {
         if (mBannerPagerAdapter.getListSize() > 1) {
@@ -281,27 +288,8 @@ public class BannerViewPager<T, VH extends RecyclerView.ViewHolder> extends Rela
         if (list.size() > 1 && isCanLoop()) {
             mViewPager.setCurrentItem(MAX_VALUE / 2 - ((MAX_VALUE / 2) % list.size()) + 1);
         }
-        mViewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
-            @Override
-            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-                super.onPageScrolled(position, positionOffset, positionOffsetPixels);
-                BannerViewPager.this.onPageScrolled(position, positionOffset, positionOffsetPixels);
-            }
-
-            @Override
-            public void onPageSelected(int position) {
-                super.onPageSelected(position);
-                BannerViewPager.this.onPageSelected(position);
-            }
-
-            @Override
-            public void onPageScrollStateChanged(int state) {
-                super.onPageScrollStateChanged(state);
-                BannerViewPager.this.onPageScrollStateChanged(state);
-            }
-        });
-//        mViewPager.removeOnPageChangeListener(this);
-//        mViewPager.addOnPageChangeListener(this);
+        mViewPager.unregisterOnPageChangeCallback(mOnPageChangeCallback);
+        mViewPager.registerOnPageChangeCallback(mOnPageChangeCallback);
 //        BannerOptions bannerOptions = mBannerManager.bannerOptions();
 //        mViewPager.setScrollDuration(bannerOptions.getScrollDuration());
 //        mViewPager.disableTouchScroll(bannerOptions.isDisableTouchScroll());
@@ -316,7 +304,7 @@ public class BannerViewPager<T, VH extends RecyclerView.ViewHolder> extends Rela
     private RecyclerView.Adapter getAdapter(List<T> list) {
         mBannerPagerAdapter = new BaseBannerAdapter<>(list, holderCreator);
         mBannerPagerAdapter.setCanLoop(isCanLoop());
-        mBannerPagerAdapter.setPageClickListener(new BannerPagerAdapter.PageClickListener() {
+        mBannerPagerAdapter.setPageClickListener(new BaseBannerAdapter.PageClickListener() {
             @Override
             public void onPageClick(int position) {
                 if (mOnPageClickListener != null) {
@@ -790,10 +778,10 @@ public class BannerViewPager<T, VH extends RecyclerView.ViewHolder> extends Rela
         void onPageClick(int position);
     }
 
-    private ViewPager.OnPageChangeListener mOnPageChangeListener;
+    private ViewPager2.OnPageChangeCallback onPageChangeCallback;
 
-    public BannerViewPager<T, VH> setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) {
-        mOnPageChangeListener = onPageChangeListener;
+    public BannerViewPager<T, VH> setOnPageChangeCallback(ViewPager2.OnPageChangeCallback onPageChangeCallback) {
+        this.onPageChangeCallback = onPageChangeCallback;
         return this;
     }
 

+ 0 - 146
bannerview/src/main/java/com/zhpan/bannerview/adapter/BannerPagerAdapter.java

@@ -1,146 +0,0 @@
-package com.zhpan.bannerview.adapter;
-
-import androidx.annotation.NonNull;
-import androidx.viewpager.widget.PagerAdapter;
-
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.zhpan.bannerview.holder.HolderCreator;
-import com.zhpan.bannerview.holder.ViewHolder;
-import com.zhpan.bannerview.utils.BannerUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Created by zhpan on 2017/3/28.
- */
-
-public class BannerPagerAdapter<T, VH extends ViewHolder> extends PagerAdapter {
-
-    private List<T> mList;
-
-    private HolderCreator holderCreator;
-
-    private boolean isCanLoop;
-
-    private PageClickListener mPageClickListener;
-
-    public static final int MAX_VALUE = 500;
-
-    public BannerPagerAdapter(List<T> list, HolderCreator<VH> holderCreator) {
-        mList = new ArrayList<>();
-        mList.addAll(list);
-        this.holderCreator = holderCreator;
-    }
-
-    @Override
-    public int getCount() {
-        if (isCanLoop && mList.size() > 1) {
-            return MAX_VALUE;
-        } else {
-            return mList.size();
-        }
-    }
-
-    @Override
-    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
-        return view == object;
-    }
-
-    @Override
-    public @NonNull
-    Object instantiateItem(@NonNull final ViewGroup container, final int position) {
-        View itemView = getView(container, BannerUtils.getRealPosition(isCanLoop, position, mList.size()));
-        container.addView(itemView);
-        return itemView;
-    }
-
-//    @Override
-//    public int getItemPosition(@NonNull Object object) {
-//        return POSITION_NONE;
-//    }
-    //  没必要缓存
-//    private View findViewByPosition(ViewGroup container, int position) {
-//        for (View view : mViewList) {
-//            if (((int) view.getTag()) == position && view.getParent() == null) {
-//                return view;
-//            }
-//        }
-//        View view = getView(container, position);
-//        view.setTag(position);
-//        mViewList.add(view);
-//        return view;
-//    }
-
-    @SuppressWarnings("unchecked")
-    private View getView(ViewGroup container, final int position) {
-        ViewHolder<T> holder = holderCreator.createViewHolder();
-        if (holder == null) {
-            throw new NullPointerException("Can not return a null holder");
-        }
-        return createView(holder, position, container);
-    }
-
-    private View createView(ViewHolder<T> holder, int position, ViewGroup container) {
-        View itemView = LayoutInflater.from(container.getContext()).inflate(holder.getLayoutId(), container, false);
-        if (mList != null && mList.size() > 0) {
-//            holder.createView(itemView, position);
-            setViewListener(itemView, position);
-            holder.onBind(itemView, mList.get(position), position, mList.size());
-        }
-        return itemView;
-    }
-
-    private void setViewListener(View view, final int position) {
-        if (view != null)
-            view.setOnClickListener(new View.OnClickListener() {
-                @Override
-                public void onClick(View v) {
-                    if (null != mPageClickListener)
-                        mPageClickListener.onPageClick(position);
-                }
-            });
-    }
-
-    @Override
-    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
-        container.removeView((View) object);
-    }
-
-    @Override
-    public void finishUpdate(@NonNull ViewGroup container) {
-        super.finishUpdate(container);
-    }
-
-    public void setPageClickListener(PageClickListener pageClickListener) {
-        mPageClickListener = pageClickListener;
-    }
-
-    public void setCanLoop(boolean canLoop) {
-        isCanLoop = canLoop;
-    }
-
-
-    public interface PageClickListener {
-        void onPageClick(int position);
-    }
-
-//    public void setList(List<T> list) {
-//        mList.clear();
-//        notifyDataSetChanged();
-//        mList.addAll(list);
-//        notifyDataSetChanged();
-//        mViewList.clear();
-//    }
-
-    public List<T> getList() {
-        return mList;
-    }
-
-    public int getListSize() {
-        return mList.size();
-    }
-}

+ 7 - 7
bannerview/src/main/java/com/zhpan/bannerview/adapter/BaseBannerAdapter.java

@@ -13,18 +13,14 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * <pre>
- *   Created by zhangpan on 2020/3/31.
- *   Description:
- * </pre>
+ * Created by zhpan on 2017/3/28.
  */
 public class BaseBannerAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> {
     private List<T> mList = new ArrayList<>();
     private HolderCreator2<VH> mHolderCreator;
     private boolean isCanLoop;
     public static final int MAX_VALUE = 500;
-    private BannerPagerAdapter.PageClickListener mPageClickListener;
-
+    private PageClickListener mPageClickListener;
     public BaseBannerAdapter(List<T> list, HolderCreator2<VH> holderCreator) {
         mList.addAll(list);
         this.mHolderCreator = holderCreator;
@@ -73,11 +69,15 @@ public class BaseBannerAdapter<T, VH extends RecyclerView.ViewHolder> extends Re
         isCanLoop = canLoop;
     }
 
-    public void setPageClickListener(BannerPagerAdapter.PageClickListener pageClickListener) {
+    public void setPageClickListener(PageClickListener pageClickListener) {
         mPageClickListener = pageClickListener;
     }
 
     public int getListSize() {
         return mList.size();
     }
+
+    public interface PageClickListener {
+        void onPageClick(int position);
+    }
 }

+ 0 - 21
bannerview/src/main/java/com/zhpan/bannerview/adapter/OnPageChangeListenerAdapter.java

@@ -1,21 +0,0 @@
-package com.zhpan.bannerview.adapter;
-
-import androidx.viewpager.widget.ViewPager;
-
-public abstract class OnPageChangeListenerAdapter implements ViewPager.OnPageChangeListener {
-
-    @Override
-    public void onPageSelected(int position) {
-
-    }
-
-    @Override
-    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-
-    }
-
-    @Override
-    public void onPageScrollStateChanged(int state) {
-
-    }
-}