Browse Source

Optimize mutiple item type. (#109)

* 多类型Item问题修复
zhpanvip 5 years ago
parent
commit
1a67aaaa33
26 changed files with 237 additions and 181 deletions
  1. 9 9
      README.md
  2. 18 9
      README_CN.md
  3. 1 0
      app/build.gradle
  4. 8 0
      app/proguard-rules.pro
  5. BIN
      app/release/app-release.apk
  6. 16 3
      app/src/main/java/com/example/zhpan/circleviewpager/adapter/HomeAdapter.java
  7. 8 5
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/HomeFragment.java
  8. 2 5
      app/src/main/java/com/example/zhpan/circleviewpager/fragment/OthersFragment.java
  9. 2 0
      app/src/main/java/com/example/zhpan/circleviewpager/net/BannerData.java
  10. 26 0
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/BaseNetViewHolder.java
  11. 1 2
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/NetViewHolder.java
  12. 35 0
      app/src/main/java/com/example/zhpan/circleviewpager/viewholder/VideoViewHolder.java
  13. 11 0
      app/src/main/res/layout/item_video.xml
  14. 6 2
      bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java
  15. 15 5
      bannerview/src/main/java/com/zhpan/bannerview/BaseBannerAdapter.java
  16. 3 6
      bannerview/src/main/java/com/zhpan/bannerview/BaseViewHolder.java
  17. 0 135
      bannerview/src/main/java/com/zhpan/bannerview/provider/ProxyLayoutManger.java
  18. 76 0
      bannerview/src/main/java/com/zhpan/bannerview/provider/ScrollDurationManger.java
  19. BIN
      image/page_style_multi.gif
  20. BIN
      image/page_style_multi_overlay.gif
  21. BIN
      image/page_style_multi_scale.gif
  22. BIN
      image/qq_group.png
  23. BIN
      image/qrcode.png
  24. BIN
      image/style_custom1.gif
  25. BIN
      image/style_custom2.gif
  26. BIN
      image/style_custum.gif

+ 9 - 9
README.md

@@ -29,7 +29,7 @@
 
  ### [Click here or scan the QR code to download demo apk](https://github.com/zhpanvip/BannerViewPager/raw/master/app/release/app-release.apk)
 
-![QRCode](https://github.com/zhpanvip/BannerViewPager/blob/master/image/qrcode.png)
+![QRCode](https://github.com/zhpanvip/Resource/blob/master/image/banner/qrcode.png)
 
 
 ### 1.PageStyle
@@ -38,7 +38,7 @@
 
 | MULTI_PAGE |MULTI_PAGE_SCALE | MULTI_PAGE_OVERLAP |
 |--|--|--|
-| ![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi.gif) |![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi_scale.gif) |![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi_overlay.gif) |
+| ![MULTI_PAGE](https://github.com/zhpanvip/Resource/blob/master/image/banner/page_style_multi.gif) |![MULTI_PAGE](https://github.com/zhpanvip/Resource/blob/master/image/banner/page_style_multi_scale.gif) |![MULTI_PAGE](https://github.com/zhpanvip/Resource/blob/master/image/banner/page_style_multi_overlay.gif) |
 
 ### 2.Indicator
 
@@ -52,9 +52,9 @@ BannerViewPager supports three Indicator Styles and three Indicator Slide mode n
 
 | Attrs | CIRCLE | DASH | ROUND_RECT |
 |--|--|--|--|
-| NORMAL| ![CIRCLE_NORMAL](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/slide_circle_normal.gif) | ![DASH_NORMAL](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_dash_normal.gif) | ![ROUND_RECT_NORMAL](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_round_rect_normal.gif) |
-| SMOOTH| ![CIRCLE_SMOOTH](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/slide_circle_smooth.gif) | ![DASH_SMOOTH](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_dash_smooth.gif) | ![ROUND_RECT_SMOOTH](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_round_rect_smooth.gif) |
-| WORM| ![CIRCLE_WORM](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/slide_circle_worm.gif) | ![DASH_WORM](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_dash_worm.gif) | ![ROUND_WORM](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_round_rect_worm.gif) |
+| NORMAL| ![CIRCLE_NORMAL](https://github.com/zhpanvip/Resource/blob/master/image/indicator/slide_circle_normal.gif) | ![DASH_NORMAL](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_dash_normal.gif) | ![ROUND_RECT_NORMAL](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_round_rect_normal.gif) |
+| SMOOTH| ![CIRCLE_SMOOTH](https://github.com/zhpanvip/Resource/blob/master/image/indicator/slide_circle_smooth.gif) | ![DASH_SMOOTH](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_dash_smooth.gif) | ![ROUND_RECT_SMOOTH](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_round_rect_smooth.gif) |
+| WORM| ![CIRCLE_WORM](https://github.com/zhpanvip/Resource/blob/master/image/indicator/slide_circle_worm.gif) | ![DASH_WORM](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_dash_worm.gif) | ![ROUND_WORM](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_round_rect_worm.gif) |
 
 #### (2)Custom Indicator
 
@@ -64,7 +64,7 @@ It's also support to custom indicator style,just need extends BaseIndicatorView
 
 | Figure Indicator | Drawable Indicator | Indicator below of Banner |
 |--|--|--|
-| ![CIRCLE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custum.gif) | ![DASH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custom1.gif) | ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custom2.gif) |
+| ![CIRCLE](https://github.com/zhpanvip/Resource/blob/master/image/banner/style_custum.gif) | ![DASH](https://github.com/zhpanvip/Resource/blob/master/image/banner/style_custom1.gif) | ![NORMAL](https://github.com/zhpanvip/Resource/blob/master/image/banner/style_custom2.gif) |
 
 
 ## API
@@ -293,7 +293,7 @@ The example will implement an custom IndicatorView as the follow gif.
 
 | Custom IndicatorView Style|
 |--|
-| ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custum.gif) |
+| ![NORMAL](https://github.com/zhpanvip/Resource/blob/master/image/banner/style_custum.gif) |
 
 **(1)Custom View and extends BaseIndicatorView**
 
@@ -408,7 +408,7 @@ you must add proguard rules,If you have called setScrollDuration method in you
 
  **If you have any question regard to BannerViewPager, please scan the QR code and join the QQ group to communicate.**
  
-![QQ交流群60902509](https://github.com/zhpanvip/BannerViewPager/blob/master/image/qq_group.png)
+![QQ交流群60902509](https://github.com/zhpanvip/Resource/blob/master/image/group/qq_group.png)
 
 ## <span id="Sponsor"> Sponsor </span>
 
@@ -416,7 +416,7 @@ you must add proguard rules,If you have called setScrollDuration method in you
 
 | Alipay | WeChat |
 |--|--|
-| ![Alipay](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/pay_alipay.jpg) |  ![WeChat](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/pay_wechat.png) |
+| ![Alipay](https://github.com/zhpanvip/Resource/tree/master/image/pay/pay_alipay.jpg) |  ![WeChat](https://github.com/zhpanvip/Resource/blob/master/image/pay/pay_wechat.png) |
 
 ##  More details
 

+ 18 - 9
README_CN.md

@@ -30,7 +30,7 @@
 
  ### [点击或扫描二维码下载apk](https://github.com/zhpanvip/BannerViewPager/raw/master/download/app.apk)
 
-![扫描下载Demo](https://github.com/zhpanvip/BannerViewPager/blob/master/image/qrcode.png)
+![扫描下载Demo](https://github.com/zhpanvip/Resource/blob/master/image/banner/qrcode.png)
 
 
 ### 1.PageStyle
@@ -39,7 +39,7 @@
 
 | MULTI_PAGE |MULTI_PAGE_SCALE | MULTI_PAGE_OVERLAP |
 |--|--|--|
-| ![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi.gif) |![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi_scale.gif) |![MULTI_PAGE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/page_style_multi_overlay.gif) |
+| ![MULTI_PAGE](https://github.com/zhpanvip/Resource/blob/master/image/banner/page_style_multi.gif) |![MULTI_PAGE](https://github.com/zhpanvip/Resource/blob/master/image/banner/page_style_multi_scale.gif) |![MULTI_PAGE](https://github.com/zhpanvip/Resource/blob/master/image/banner/page_style_multi_overlay.gif) |
 
 ### 2.Indicator 
 
@@ -51,9 +51,9 @@ BannerViewPager目前已支持三种IndicatorViewStyle,以及三种IndicatorSlid
 
 | 属性 | CIRCLE | DASH | ROUND_RECT |
 |--|--|--|--|
-| NORMAL| ![CIRCLE_NORMAL](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/slide_circle_normal.gif) | ![DASH_NORMAL](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_dash_normal.gif) | ![ROUND_RECT_NORMAL](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_round_rect_normal.gif) |
-| SMOOTH| ![CIRCLE_SMOOTH](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/slide_circle_smooth.gif) | ![DASH_SMOOTH](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_dash_smooth.gif) | ![ROUND_RECT_SMOOTH](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_round_rect_smooth.gif) |
-| WORM| ![CIRCLE_WORM](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/slide_circle_worm.gif) | ![DASH_WORM](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_dash_worm.gif) | ![ROUND_WORM](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/style_round_rect_worm.gif) |
+| NORMAL| ![CIRCLE_NORMAL](https://github.com/zhpanvip/Resource/blob/master/image/indicator/slide_circle_normal.gif) | ![DASH_NORMAL](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_dash_normal.gif) | ![ROUND_RECT_NORMAL](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_round_rect_normal.gif) |
+| SMOOTH| ![CIRCLE_SMOOTH](https://github.com/zhpanvip/Resource/blob/master/image/indicator/slide_circle_smooth.gif) | ![DASH_SMOOTH](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_dash_smooth.gif) | ![ROUND_RECT_SMOOTH](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_round_rect_smooth.gif) |
+| WORM| ![CIRCLE_WORM](https://github.com/zhpanvip/Resource/blob/master/image/indicator/slide_circle_worm.gif) | ![DASH_WORM](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_dash_worm.gif) | ![ROUND_WORM](https://github.com/zhpanvip/Resource/blob/master/image/indicator/style_round_rect_worm.gif) |
 
 #### (2)Custom Indicator
 
@@ -63,7 +63,7 @@ BannerViewPager目前已支持三种IndicatorViewStyle,以及三种IndicatorSlid
 
 | Figure Indicator | Drawable Indicator | Indicator below of Banner |
 |--|--|--|
-| ![CIRCLE](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custum.gif) | ![DASH](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custom1.gif) | ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custom2.gif) |
+| ![CIRCLE](https://github.com/zhpanvip/Resource/blob/master/image/banner/style_custum.gif) | ![DASH](https://github.com/zhpanvip/Resource/blob/master/image/banner/style_custom1.gif) | ![NORMAL](https://github.com/zhpanvip/Resource/blob/master/image/banner/style_custom2.gif) |
 
 
 ## 开放API
@@ -292,7 +292,7 @@ public class HomeAdapter extends BaseBannerAdapter<BannerData, NetViewHolder> {
 
 | Custom IndicatorView|
 |--|
-| ![NORMAL](https://github.com/zhpanvip/BannerViewPager/blob/master/image/style_custum.gif) |
+| ![NORMAL](https://github.com/zhpanvip/Resource/blob/master/image/banner/style_custum.gif) |
 
 **(1)自定义View并继承BaseIndicatorView**
 
@@ -372,6 +372,15 @@ public class FigureIndicatorView extends BaseIndicatorView {
               .create(mDrawableList);
 ```
 
+## 8. 混淆
+
+如果你的项目开启了混淆,并且在项目中使用了setScrollDuration方法,则必须添加以下混淆规则:
+
+```
+    -keep class androidx.recyclerview.widget.**{*;}
+    -keep class androidx.viewpager2.widget.**{*;}
+```
+
 ## TODO 版本计划
 
  - [x] 优化及重构IndicatorView(2.0.1)
@@ -394,7 +403,7 @@ public class FigureIndicatorView extends BaseIndicatorView {
 
 ## 有问题可以扫码加QQ群交流
 
- ![QQ交流群60902509](https://github.com/zhpanvip/BannerViewPager/blob/master/image/qq_group.png)
+ ![QQ交流群60902509](https://github.com/zhpanvip/Resource/blob/master/image/group/qq_group.png)
 
 
 
@@ -404,7 +413,7 @@ public class FigureIndicatorView extends BaseIndicatorView {
 
 | 支付宝 | 微信支付 |
 |--|--|
-| ![NORMAL](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/pay_alipay.jpb) |  ![SMOOTH](https://github.com/zhpanvip/viewpagerindicator/blob/master/image/pay_wechat.png) |
+| ![NORMAL](https://github.com/zhpanvip/Resource/blob/master/image/pay/pay_alipay.jpg) |  ![SMOOTH](https://github.com/zhpanvip/Resource/blob/master/image/pay/pay_wechat.png) |
 
 
 ##  更多详情请参看以下链接

+ 1 - 0
app/build.gradle

@@ -58,4 +58,5 @@ dependencies {
     implementation 'androidx.core:core-ktx:1.2.0'
     implementation 'androidx.cardview:cardview:1.0.0'
     implementation 'androidx.viewpager2:viewpager2:1.0.0'
+    implementation 'cn.jzvd:jiaozivideoplayer:7.2.3'
 }

+ 8 - 0
app/proguard-rules.pro

@@ -26,6 +26,14 @@
 -keep class com.example.zhpan.circleviewpager.bean.** { *; }
 -keep class com.example.zhpan.circleviewpager.net.** { *; }
 -keep class com.zhpan.idea.** { *; }
+-keep public class cn.jzvd.JZMediaSystem {*; }
+-keep public class cn.jzvd.demo.CustomMedia.CustomMedia {*; }
+-keep public class cn.jzvd.demo.CustomMedia.JZMediaIjk {*; }
+-keep public class cn.jzvd.demo.CustomMedia.JZMediaSystemAssertFolder {*; }
+
+-keep class tv.danmaku.ijk.media.player.** {*; }
+-dontwarn tv.danmaku.ijk.media.player.*
+-keep interface tv.danmaku.ijk.media.player.** { *; }
 
 -keep class androidx.recyclerview.widget.**{*;}
 -keep class androidx.viewpager2.widget.**{*;}

BIN
app/release/app-release.apk


+ 16 - 3
app/src/main/java/com/example/zhpan/circleviewpager/adapter/HomeAdapter.java

@@ -4,7 +4,9 @@ import android.view.View;
 
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.net.BannerData;
+import com.example.zhpan.circleviewpager.viewholder.BaseNetViewHolder;
 import com.example.zhpan.circleviewpager.viewholder.NetViewHolder;
+import com.example.zhpan.circleviewpager.viewholder.VideoViewHolder;
 import com.zhpan.bannerview.BaseBannerAdapter;
 
 /**
@@ -13,19 +15,30 @@ import com.zhpan.bannerview.BaseBannerAdapter;
  *   Description:
  * </pre>
  */
-public class HomeAdapter extends BaseBannerAdapter<BannerData, NetViewHolder> {
+public class HomeAdapter extends BaseBannerAdapter<BannerData, BaseNetViewHolder> {
     @Override
-    protected void onBind(NetViewHolder holder, BannerData data, int position, int pageSize) {
+    protected void onBind(BaseNetViewHolder holder, BannerData data, int position, int pageSize) {
         holder.bindData(data, position, pageSize);
     }
 
     @Override
-    public NetViewHolder createViewHolder(View itemView, int viewType) {
+    public BaseNetViewHolder createViewHolder(View itemView, int viewType) {
+        if (viewType == BannerData.TYPE_VIDEO) {
+            return new VideoViewHolder(itemView);
+        }
         return new NetViewHolder(itemView);
     }
 
+    @Override
+    public int getViewType(int position) {
+        return mList.get(position).getType();
+    }
+
     @Override
     public int getLayoutId(int viewType) {
+        if (viewType == BannerData.TYPE_VIDEO) {
+            return R.layout.item_video;
+        }
         return R.layout.item_net;
     }
 }

+ 8 - 5
app/src/main/java/com/example/zhpan/circleviewpager/fragment/HomeFragment.java

@@ -20,8 +20,8 @@ import com.example.zhpan.circleviewpager.bean.DataWrapper;
 import com.example.zhpan.circleviewpager.net.BannerData;
 import com.example.zhpan.circleviewpager.net.RetrofitGnerator;
 import com.example.zhpan.circleviewpager.recyclerview.ui.CustomRecyclerView;
+import com.example.zhpan.circleviewpager.viewholder.BaseNetViewHolder;
 import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
-import com.example.zhpan.circleviewpager.viewholder.NetViewHolder;
 import com.scwang.smartrefresh.header.MaterialHeader;
 import com.scwang.smartrefresh.layout.SmartRefreshLayout;
 import com.zhpan.bannerview.BannerViewPager;
@@ -44,8 +44,7 @@ import io.reactivex.schedulers.Schedulers;
  */
 public class HomeFragment extends BaseFragment {
 
-
-    private BannerViewPager<BannerData, NetViewHolder> mViewPagerHorizontal;
+    private BannerViewPager<BannerData, BaseNetViewHolder> mViewPagerHorizontal;
     private BannerViewPager<Integer, ImageResourceViewHolder> mViewPagerVertical;
     private BannerViewPager<Integer, ImageResourceViewHolder> mViewPager;
     private CustomRecyclerView recyclerView;
@@ -118,7 +117,12 @@ public class HomeFragment extends BaseFragment {
                 .subscribe(new ResponseObserver<DataWrapper>() {
                     @Override
                     public void onSuccess(DataWrapper response) {
-                        mViewPagerHorizontal.setData(response.getDataBeanList());
+                        List<BannerData> dataList = response.getDataBeanList();
+//                        BannerData bannerData = new BannerData();
+//                        bannerData.setUrl("http://jzvd.nathen.cn/c6e3dc12a1154626b3476d9bf3bd7266/6b56c5f0dc31428083757a45764763b0-5287d2089db37e62345123a1be272f8b.mp4");
+//                        bannerData.setType(BannerData.TYPE_VIDEO);
+//                        dataList.add(0, bannerData);
+                        mViewPagerHorizontal.setData(dataList);
                         articleAdapter.setData(response.getArticleList());
                         if (response.getDataBeanList().size() > 0) {
                             mTvTitle.setText(response.getDataBeanList().get(0).getTitle());
@@ -146,7 +150,6 @@ public class HomeFragment extends BaseFragment {
         mViewPagerHorizontal
                 .setIndicatorSlideMode(IndicatorSlideMode.WORM)
                 .setInterval(3000)
-                .setScrollDuration(1000)
                 .setIndicatorGravity(IndicatorGravity.END)
                 .setIndicatorSliderRadius(getResources().getDimensionPixelSize(R.dimen.dp_3))
                 .setIndicatorView(mIndicatorView)// 这里为了设置标题故用了自定义Indicator,如果无需标题则没必要添加此行代码

+ 2 - 5
app/src/main/java/com/example/zhpan/circleviewpager/fragment/OthersFragment.java

@@ -167,11 +167,8 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
     }
 
     private void updateData() {
-        //  生成[-1,3]整数
-//        initData(new Random().nextInt(5) - 1);
-        int size = new Random().nextInt(5) - 1;
-        mViewPager.setData(getPicList(size));
-        ToastUtils.show("size=" + size);
+        mViewPager.setData(getPicList(new Random().nextInt(5)));
+        ToastUtils.show("size=" + mViewPager.getData().size());
 
     }
 

+ 2 - 0
app/src/main/java/com/example/zhpan/circleviewpager/net/BannerData.java

@@ -19,6 +19,8 @@ public class BannerData {
      * url : https://flutter.cn/
      */
 
+    public static final int TYPE_VIDEO = 10000;
+
     private String desc;
     private int id;
     private String imagePath;

+ 26 - 0
app/src/main/java/com/example/zhpan/circleviewpager/viewholder/BaseNetViewHolder.java

@@ -0,0 +1,26 @@
+package com.example.zhpan.circleviewpager.viewholder;
+
+import android.view.View;
+
+import androidx.annotation.NonNull;
+
+import com.example.zhpan.circleviewpager.net.BannerData;
+import com.zhpan.bannerview.BaseViewHolder;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2020/4/9.
+ *   Description:
+ * </pre>
+ */
+public class BaseNetViewHolder extends BaseViewHolder<BannerData> {
+
+    public BaseNetViewHolder(@NonNull View itemView) {
+        super(itemView);
+    }
+
+    @Override
+    public void bindData(BannerData data, int position, int pageSize) {
+
+    }
+}

+ 1 - 2
app/src/main/java/com/example/zhpan/circleviewpager/viewholder/NetViewHolder.java

@@ -8,7 +8,6 @@ import com.bumptech.glide.Glide;
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.net.BannerData;
 import com.example.zhpan.circleviewpager.view.CornerImageView;
-import com.zhpan.bannerview.BaseViewHolder;
 import com.zhpan.bannerview.utils.BannerUtils;
 
 /**
@@ -17,7 +16,7 @@ import com.zhpan.bannerview.utils.BannerUtils;
  *   Description:
  * </pre>
  */
-public class NetViewHolder extends BaseViewHolder<BannerData> {
+public class NetViewHolder extends BaseNetViewHolder {
 
     public NetViewHolder(@NonNull View itemView) {
         super(itemView);

+ 35 - 0
app/src/main/java/com/example/zhpan/circleviewpager/viewholder/VideoViewHolder.java

@@ -0,0 +1,35 @@
+package com.example.zhpan.circleviewpager.viewholder;
+
+import android.view.View;
+
+import androidx.annotation.NonNull;
+
+import com.example.zhpan.circleviewpager.R;
+import com.example.zhpan.circleviewpager.net.BannerData;
+
+import cn.jzvd.JzvdStd;
+
+/**
+ * <pre>
+ *   Created by zhangpan on 2020/4/9.
+ *   Description:
+ * </pre>
+ */
+public class VideoViewHolder extends BaseNetViewHolder {
+    private JzvdStd jzvdStd;
+
+    public VideoViewHolder(@NonNull View itemView) {
+        super(itemView);
+        jzvdStd = findView(R.id.banner_video);
+
+    }
+
+    @Override
+    public void bindData(BannerData data, int position, int pageSize) {
+        super.bindData(data, position, pageSize);
+    }
+
+    public JzvdStd getJzvdStd() {
+        return jzvdStd;
+    }
+}

+ 11 - 0
app/src/main/res/layout/item_video.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <cn.jzvd.JzvdStd
+        android:id="@+id/banner_video"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent" />
+
+</RelativeLayout>

+ 6 - 2
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -23,7 +23,7 @@ import com.zhpan.bannerview.annotation.Visibility;
 import com.zhpan.bannerview.constants.PageStyle;
 import com.zhpan.bannerview.manager.BannerManager;
 import com.zhpan.bannerview.manager.BannerOptions;
-import com.zhpan.bannerview.provider.ProxyLayoutManger;
+import com.zhpan.bannerview.provider.ScrollDurationManger;
 import com.zhpan.bannerview.transform.OverlapPageTransformer;
 import com.zhpan.bannerview.transform.ScaleInTransformer;
 import com.zhpan.bannerview.utils.BannerUtils;
@@ -330,7 +330,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder> extends RelativeLayou
         }
         BannerOptions bannerOptions = mBannerManager.bannerOptions();
         if (bannerOptions.getScrollDuration() != 0)
-            ProxyLayoutManger.setScrollProxy(mViewPager, bannerOptions.getScrollDuration());
+            ScrollDurationManger.reflectLayoutManager(mViewPager, bannerOptions.getScrollDuration());
         currentPosition = 0;
         mBannerPagerAdapter.setCanLoop(isCanLoop());
         mBannerPagerAdapter.setPageClickListener(mOnPageClickListener);
@@ -436,6 +436,10 @@ public class BannerViewPager<T, VH extends BaseViewHolder> extends RelativeLayou
         return this;
     }
 
+    public BaseBannerAdapter<T, VH> getAdapter() {
+        return mBannerPagerAdapter;
+    }
+
     /**
      * Set round rectangle effect for BannerViewPager.
      * <p>

+ 15 - 5
bannerview/src/main/java/com/zhpan/bannerview/BaseBannerAdapter.java

@@ -16,22 +16,21 @@ import java.util.List;
  * Created by zhpan on 2017/3/28.
  */
 public abstract class BaseBannerAdapter<T, VH extends BaseViewHolder> extends RecyclerView.Adapter<VH> {
-    private List<T> mList = new ArrayList<>();
+    protected List<T> mList = new ArrayList<>();
     private boolean isCanLoop;
     static final int MAX_VALUE = 500;
     private BannerViewPager.OnPageClickListener mPageClickListener;
 
     @NonNull
     @Override
-    public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+    public final VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
         View inflate = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false);
         return createViewHolder(inflate, viewType);
     }
 
     @Override
-    public void onBindViewHolder(@NonNull VH holder, final int position) {
+    public final void onBindViewHolder(@NonNull VH holder, final int position) {
         int realPosition = BannerUtils.getRealPosition(isCanLoop, position, mList.size());
-        onBind(holder, mList.get(realPosition), realPosition, mList.size());
         holder.itemView.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
@@ -40,10 +39,17 @@ public abstract class BaseBannerAdapter<T, VH extends BaseViewHolder> extends Re
                 }
             }
         });
+        onBind(holder, mList.get(realPosition), realPosition, mList.size());
+    }
+
+    @Override
+    public final int getItemViewType(int position) {
+        int realPosition = BannerUtils.getRealPosition(isCanLoop, position, mList.size());
+        return getViewType(realPosition);
     }
 
     @Override
-    public int getItemCount() {
+    public final int getItemCount() {
         if (isCanLoop && mList.size() > 1) {
             return MAX_VALUE;
         } else {
@@ -74,6 +80,10 @@ public abstract class BaseBannerAdapter<T, VH extends BaseViewHolder> extends Re
         return mList.size();
     }
 
+    protected int getViewType(int position) {
+        return 0;
+    }
+
     protected abstract void onBind(VH holder, T data, int position, int pageSize);
 
     public abstract VH createViewHolder(View itemView, int viewType);

+ 3 - 6
bannerview/src/main/java/com/zhpan/bannerview/BaseViewHolder.java

@@ -61,18 +61,15 @@ public abstract class BaseViewHolder<T> extends RecyclerView.ViewHolder {
     }
 
     protected void setOnClickListener(int viewId, View.OnClickListener clickListener) {
-        View view = findView(viewId);
-        view.setOnClickListener(clickListener);
+        findView(viewId).setOnClickListener(clickListener);
     }
 
     protected void setBackgroundResource(int viewId, @DrawableRes int resId) {
-        View view = findView(viewId);
-        view.setBackgroundResource(resId);
+        findView(viewId).setBackgroundResource(resId);
     }
 
     protected void setBackgroundColor(int viewId, @ColorInt int colorId) {
-        View view = findView(viewId);
-        view.setBackgroundColor(colorId);
+        findView(viewId).setBackgroundColor(colorId);
     }
 
     protected void setImageResource(@IdRes int viewId, @DrawableRes int resId) {

+ 0 - 135
bannerview/src/main/java/com/zhpan/bannerview/provider/ProxyLayoutManger.java

@@ -1,135 +0,0 @@
-package com.zhpan.bannerview.provider;
-
-import android.graphics.Rect;
-import android.os.Bundle;
-import android.view.View;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.LinearSmoothScroller;
-import androidx.recyclerview.widget.RecyclerView;
-import androidx.viewpager2.widget.ViewPager2;
-
-import java.lang.reflect.Field;
-
-
-/**
- * source form:https://github.com/youth5201314/banner/blob/master/banner/src/main/java/com/youth/banner/util/ProxyLayoutManger.java
- * thanks:https://github.com/zguop/banner/blob/master/pager2banner/src/main/java/com/to/aboomy/pager2banner/Banner.java
- */
-public class ProxyLayoutManger extends LinearLayoutManager {
-
-    private LinearLayoutManager linearLayoutManager;
-    private RecyclerView recyclerView;
-    private ViewPager2 mViewPager2;
-    private long scrollDuration;
-
-    public static void setScrollProxy(ViewPager2 viewPager2, long scrollDuration) {
-        RecyclerView recyclerView = (RecyclerView) viewPager2.getChildAt(0);
-        recyclerView.setOverScrollMode(RecyclerView.OVER_SCROLL_NEVER);
-        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
-        if (layoutManager != null) {
-            ProxyLayoutManger manger = new ProxyLayoutManger(viewPager2, scrollDuration, recyclerView, (LinearLayoutManager) layoutManager);
-            recyclerView.setLayoutManager(manger);
-        }
-    }
-
-    private ProxyLayoutManger(ViewPager2 viewPager2, long scrollDuration, RecyclerView recyclerView, LinearLayoutManager layoutManager) {
-        super(viewPager2.getContext(), layoutManager.getOrientation(), false);
-        this.mViewPager2 = viewPager2;
-        this.scrollDuration = scrollDuration;
-        this.recyclerView = recyclerView;
-        this.linearLayoutManager = layoutManager;
-        reflectLayoutManager();
-    }
-
-    private void reflectLayoutManager() {
-        try {
-            //虽然设置了ProxyLayoutManger,但是还是调用的linearLayoutManager中实现的方法
-            //将mRecyclerView重新赋值,可以避免使用mRecyclerView时为null
-            Field mRecyclerView = RecyclerView.LayoutManager.class.getDeclaredField("mRecyclerView");
-            mRecyclerView.setAccessible(true);
-            mRecyclerView.set(linearLayoutManager, recyclerView);
-
-            Field LayoutMangerField = ViewPager2.class.getDeclaredField("mLayoutManager");
-            LayoutMangerField.setAccessible(true);
-            LayoutMangerField.set(mViewPager2, this);
-
-            Field pageTransformerAdapterField = ViewPager2.class.getDeclaredField("mPageTransformerAdapter");
-            pageTransformerAdapterField.setAccessible(true);
-            Object mPageTransformerAdapter = pageTransformerAdapterField.get(mViewPager2);
-            if (mPageTransformerAdapter != null) {
-                Class<?> aClass = mPageTransformerAdapter.getClass();
-                Field layoutManager = aClass.getDeclaredField("mLayoutManager");
-                layoutManager.setAccessible(true);
-                layoutManager.set(mPageTransformerAdapter, this);
-            }
-            Field scrollEventAdapterField = ViewPager2.class.getDeclaredField("mScrollEventAdapter");
-            scrollEventAdapterField.setAccessible(true);
-            Object mScrollEventAdapter = scrollEventAdapterField.get(mViewPager2);
-            if (mScrollEventAdapter != null) {
-                Class<?> aClass = mScrollEventAdapter.getClass();
-                Field layoutManager = aClass.getDeclaredField("mLayoutManager");
-                layoutManager.setAccessible(true);
-                layoutManager.set(mScrollEventAdapter, this);
-            }
-        } catch (NoSuchFieldException e) {
-            e.printStackTrace();
-        } catch (IllegalAccessException e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Override
-    public boolean performAccessibilityAction(@NonNull RecyclerView.Recycler recycler,
-                                              @NonNull RecyclerView.State state, int action, @Nullable Bundle args) {
-        return linearLayoutManager.performAccessibilityAction(recycler, state, action, args);
-    }
-
-    @Override
-    public void onInitializeAccessibilityNodeInfo(@NonNull RecyclerView.Recycler recycler,
-                                                  @NonNull RecyclerView.State state, @NonNull AccessibilityNodeInfoCompat info) {
-        linearLayoutManager.onInitializeAccessibilityNodeInfo(recycler, state, info);
-    }
-
-    @Override
-    public boolean requestChildRectangleOnScreen(@NonNull RecyclerView parent,
-                                                 @NonNull View child, @NonNull Rect rect, boolean immediate,
-                                                 boolean focusedChildVisible) {
-        return linearLayoutManager.requestChildRectangleOnScreen(parent, child, rect, immediate);
-    }
-
-    @Override
-    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
-        LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
-            @Override
-            protected int calculateTimeForDeceleration(int dx) {
-                return (int) (scrollDuration * (1 - .3356));
-            }
-        };
-        linearSmoothScroller.setTargetPosition(position);
-        startSmoothScroll(linearSmoothScroller);
-    }
-
-    @Override
-    protected void calculateExtraLayoutSpace(@NonNull RecyclerView.State state,
-                                             @NonNull int[] extraLayoutSpace) {
-        int pageLimit = mViewPager2.getOffscreenPageLimit();
-        if (pageLimit == ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT) {
-            super.calculateExtraLayoutSpace(state, extraLayoutSpace);
-            return;
-        }
-        final int offscreenSpace = getPageSize() * pageLimit;
-        extraLayoutSpace[0] = offscreenSpace;
-        extraLayoutSpace[1] = offscreenSpace;
-    }
-
-    private int getPageSize() {
-        final RecyclerView rv = (RecyclerView) mViewPager2.getChildAt(0);
-        return getOrientation() == RecyclerView.HORIZONTAL
-                ? rv.getWidth() - rv.getPaddingLeft() - rv.getPaddingRight()
-                : rv.getHeight() - rv.getPaddingTop() - rv.getPaddingBottom();
-    }
-}

+ 76 - 0
bannerview/src/main/java/com/zhpan/bannerview/provider/ScrollDurationManger.java

@@ -0,0 +1,76 @@
+package com.zhpan.bannerview.provider;
+
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.LinearSmoothScroller;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager2.widget.ViewPager2;
+
+import java.lang.reflect.Field;
+
+
+/**
+ * source form:https://github.com/youth5201314/banner/blob/master/banner/src/main/java/com/youth/banner/util/ScrollSpeedManger.java
+ * thanks:https://github.com/zguop/banner/blob/master/pager2banner/src/main/java/com/to/aboomy/pager2banner/Banner.java
+ */
+public class ScrollDurationManger extends LinearLayoutManager {
+    private int scrollDuration;
+
+    public ScrollDurationManger(ViewPager2 viewPager2, int scrollDuration, RecyclerView recyclerView, LinearLayoutManager linearLayoutManager) {
+        super(viewPager2.getContext(), linearLayoutManager.getOrientation(), false);
+        this.scrollDuration = scrollDuration;
+    }
+
+    @Override
+    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
+        LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {
+            @Override
+            protected int calculateTimeForDeceleration(int dx) {
+                return scrollDuration;
+            }
+        };
+        linearSmoothScroller.setTargetPosition(position);
+        startSmoothScroll(linearSmoothScroller);
+    }
+
+    public static void reflectLayoutManager(ViewPager2 viewPager2, int scrollDuration) {
+        try {
+            RecyclerView recyclerView = (RecyclerView) viewPager2.getChildAt(0);
+            recyclerView.setOverScrollMode(RecyclerView.OVER_SCROLL_NEVER);
+            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
+            ScrollDurationManger speedManger = new ScrollDurationManger(viewPager2, scrollDuration, recyclerView, linearLayoutManager);
+            recyclerView.setLayoutManager(speedManger);
+
+            Field mRecyclerView = RecyclerView.LayoutManager.class.getDeclaredField("mRecyclerView");
+            mRecyclerView.setAccessible(true);
+            mRecyclerView.set(linearLayoutManager, recyclerView);
+
+            Field LayoutMangerField = ViewPager2.class.getDeclaredField("mLayoutManager");
+            LayoutMangerField.setAccessible(true);
+            LayoutMangerField.set(viewPager2, speedManger);
+
+            Field pageTransformerAdapterField = ViewPager2.class.getDeclaredField("mPageTransformerAdapter");
+            pageTransformerAdapterField.setAccessible(true);
+            Object mPageTransformerAdapter = pageTransformerAdapterField.get(viewPager2);
+            if (mPageTransformerAdapter != null) {
+                Class<?> aClass = mPageTransformerAdapter.getClass();
+                Field layoutManager = aClass.getDeclaredField("mLayoutManager");
+                layoutManager.setAccessible(true);
+                layoutManager.set(mPageTransformerAdapter, speedManger);
+            }
+            Field scrollEventAdapterField = ViewPager2.class.getDeclaredField("mScrollEventAdapter");
+            scrollEventAdapterField.setAccessible(true);
+            Object mScrollEventAdapter = scrollEventAdapterField.get(viewPager2);
+            if (mScrollEventAdapter != null) {
+                Class<?> aClass = mScrollEventAdapter.getClass();
+                Field layoutManager = aClass.getDeclaredField("mLayoutManager");
+                layoutManager.setAccessible(true);
+                layoutManager.set(mScrollEventAdapter, speedManger);
+            }
+        } catch (NoSuchFieldException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+    }
+
+}

BIN
image/page_style_multi.gif


BIN
image/page_style_multi_overlay.gif


BIN
image/page_style_multi_scale.gif


BIN
image/qq_group.png


BIN
image/qrcode.png


BIN
image/style_custom1.gif


BIN
image/style_custom2.gif


BIN
image/style_custum.gif