Browse Source

dev 3.1.0 refreshData supported (#114)

* Don't need init indicator if indicatorView is Gone or Invisible.

* refreshData supported.

* 修复只有一页时滑动冲突问题
zhpanvip 5 years ago
parent
commit
1ae99ce7d5

+ 123 - 56
README.md

@@ -5,6 +5,7 @@
 [![JitPack](https://jitpack.io/v/zhpanvip/BannerViewPager.svg)](https://jitpack.io/#zhpanvip/BannerViewPager)
 [ ![JCenter](https://api.bintray.com/packages/zhpanvip/CircleViewPager/bannerview/images/download.svg) ](https://bintray.com/zhpanvip/CircleViewPager/bannerview/_latestVersion)
 [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-BannerViewPager-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/7961)
+[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-ViewPagerIndicator-brightgreen.svg?style=flat)](https://github.com/zhpanvip/viewpagerindicator)
 
 ## English | [中文](https://github.com/zhpanvip/BannerViewPager/blob/master/README_CN.md)
 
@@ -23,6 +24,9 @@
 - setUserInputEnabled replaces disableTouchScroll
 - remove setPageTransformerStyle
 - remvoe some deprecate methods in 2.x
+- no longer support Android support library
+- SCALE slide mode and COLOR slide mode supported(V3.1.0)
+- refreshData() supported (V3.1.0)
 
 ## Preview
 
@@ -39,7 +43,7 @@
 |--|--|--|
 | ![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
+### 2.[Indicator](https://github.com/zhpanvip/viewpagerindicator)
 
 The Indicator library was split from BannerViewPager,the new repo is [ViewPagerIndicator](https://github.com/zhpanvip/viewpagerindicator),Click the link to see more information about [ViewPagerIndicator](https://github.com/zhpanvip/viewpagerindicator)
 
@@ -72,60 +76,60 @@ It's also support to custom indicator style,just need extends BaseIndicatorView
 
 | Methods | Description | Default |
 |--|--|--|
-| BannerViewPager<T, VH> setCanLoop(boolean) | 是否开启循环 | 默认值true|
-| BannerViewPager<T, VH> setAutoPlay(boolean) | 是否开启自动轮播 | 默认值true|
-| BannerViewPager<T, VH> setInterval(int) | 自动轮播时间间隔 |单位毫秒,默认值3000  |
-| BannerViewPager<T, VH> setScrollDuration(int) | 设置页面滚动时间 | 设置页面滚动时间 |单位毫秒,默认值500  |
-| BannerViewPager<T, VH> setRoundCorner(int) | 设置圆角 |默认无圆角 需要SDK_INT>=LOLLIPOP(API 21)  |
-| BannerViewPager<T, VH> setOnPageClickListener(OnPageClickListener) | 设置页面点击事件 |  |
-| BannerViewPager<T, VH> setAdapter(BaseBannerAdapter\<T, VH>) |设置Adapter  |必须设置Adapter,否则会抛出NullPointerException|
-| BannerViewPager<T, VH> setIndicatorVisibility(int) | indicator visibility |默认值VISIBLE 2.4.2 新增|
-| BannerViewPager<T, VH> setIndicatorStyle(int) | 设置指示器样式 | 可选枚举(CIRCLE, DASH、ROUND_RECT) 默认CIRCLE  |
-| BannerViewPager<T, VH> setIndicatorGravity(int) | 指示器位置 |可选值(CENTER、START、END)默认值CENTER |
-| BannerViewPager<T, VH> setIndicatorColor(int,int) | 指示器圆点颜色 |normalColor:未选中时颜色默认"#8C6C6D72", checkedColor:选中时颜色 默认"#8C18171C" |
-| BannerViewPager<T, VH> setIndicatorSlideMode(int slideMode)  | 设置Indicator滑动模式 | 可选(NORMAL、SMOOTH、WORM),默认值NORMAL  |
-| BannerViewPager<T, VH> setIndicatorSliderRadius(int radius) | 设置指示器圆点半径 | 默认值4dp|
-| BannerViewPager<T, VH> setIndicatorSliderRadius(int normalRadius,int checkRadius)  |设置指示器圆点半径  |  normalRadius:未选中时半径  checkedRadius:选中时的半径,默认值4dp |
-| BannerViewPager<T, VH> setIndicatorSliderWidth(int) | 设置指示器宽度,如果是圆形指示器,则为直径 |  默认值8dp|
-| BannerViewPager<T, VH> setIndicatorSliderWidth(int normalWidth, int checkWidth) | 设置指示器宽度,如果是圆形指示器,则为直径 | 默认值8dp |
-| BannerViewPager<T, VH> setIndicatorHeight(int) | 设置指示器高度,仅在Indicator样式为DASH时有效 | 默认值normalIndicatorWidth/2 |
-| BannerViewPager<T, VH> setIndicatorSliderGap(int) | 指示器圆点间距| 默认值为指示器宽度(或者是圆的直径)|
-| BannerViewPager<T, VH> setIndicatorView(IIndicator) | 设置自定义指示器|自定义View需要继承BaseIndicatorView或实现IIndicator |
-| BannerViewPager<T, VH> setPageTransformer(ViewPager2.PageTransformer) | 设置页面Transformer内置样式 |  |
-| BannerViewPager<T, VH> addPageTransformer(ViewPager2.PageTransformer) | 3.0.0新增,添加页面Transformer样式 |  |
-| BannerViewPager<T, VH> removeTransformer(ViewPager2.PageTransformer) | 3.0.0新增,移除页面Transformer |  |
-| BannerViewPager<T, VH> setCurrentItem(int) | Set the currently selected page. | 2.3.5新增 |
-| int getCurrentItem() | 获取当前position | 2.3.5新增 |
-| BannerViewPager<T, VH> setPageStyle(PageStyle) | 设置页面样式 | 2.4.0新增 可选(MULTI_PAGE、MULTI_PAGE_SCALE、MULTI_PAGE_OVERLAP)|
-| BannerViewPager<T, VH> setPageMargin(int) | 设置页面间隔 | 2.4.0新增 |
-| BannerViewPager<T, VH> setIndicatorMargin(int left, int top, int right, int bottom) | 设置Indicator边距 | 2.4.1新增 |
-| BannerViewPager<T, VH> registerOnPageChangeCallback(OnPageChangeListener) | 页面改变的监听事件 | 2.4.3新增 |
-| BannerViewPager<T, VH> setRoundRect(int) | 设置页面滑动方向|为BannerViewPager设置圆角 |
-| BannerViewPager<T, VH> setOrientation(int) | 设置页面滑动方向| 3.0.0新增 支持水平和竖直滑动 |
-| BannerViewPager<T, VH> setUserInputEnabled(int) | 是否开启用户输入 | |
-| void startLoop() |开启自动轮播 | 初始化BannerViewPager时不必调用该方法,设置setAutoPlay后会调用startLoop() |
-| void stopLoop() | 停止自动轮播 | |
-| List\<T> getData() | 获取Banner中的集合数据 |  |
-| void create(List<T> list) |初始化并构造BannerViewPager  |必须调用,否则前面设置的参数无效  |
-
+| BannerViewPager<T, VH> setCanLoop(boolean) | set it's can loop | default value is true|
+| BannerViewPager<T, VH> setAutoPlay(boolean) | set can auto play | default value is true|
+| BannerViewPager<T, VH> setInterval(int) | set the interval of item switch |unit is millisecond,default value is 3000ms  |
+| BannerViewPager<T, VH> setScrollDuration(int) | set item scroll duration |Unit is millisecond,default value is equals ViewPager2 item scroll time  |
+| BannerViewPager<T, VH> setRoundCorner(int) | set round corner for BVP. equals setRoundRect method |Require SDK_INT>=LOLLIPOP  |
+| BannerViewPager<T, VH> setOnPageClickListener(OnPageClickListener) | set a callback that when the item is clicked |  |
+| BannerViewPager<T, VH> setAdapter(BaseBannerAdapter\<T, VH>) |set Adapter for BVP  |This method must be called,Otherwise,BVP will throw a NullPointerException|
+| BannerViewPager<T, VH> setIndicatorVisibility(int) | indicator visibility |default is VISIBLE |
+| BannerViewPager<T, VH> setIndicatorStyle(int) | set indicator style | enum(CIRCLE, DASH、ROUND_RECT) default value is CIRCLE  |
+| BannerViewPager<T, VH> setIndicatorGravity(int) | set gravity of indicator |enum(CENTER、START、END),default value is CENTER |
+| BannerViewPager<T, VH> setIndicatorColor(int,int) | set indicator slider color |default normalColor: "#8C6C6D72",default checkedColor:"#8C18171C" |
+| BannerViewPager<T, VH> setIndicatorSlideMode(int slideMode)  | set indicator slider mode | enum(NORMAL;SMOOTH;WORM;COLOR;SCALE),default value NORMAL  |
+| BannerViewPager<T, VH> setIndicatorSliderRadius(int radius) | set indicator slider radius | default value is 4dp|
+| BannerViewPager<T, VH> setIndicatorSliderRadius(int normalRadius,int checkRadius)  |set indicator slider radius  |  default value is 4dp |
+| BannerViewPager<T, VH> setIndicatorSliderWidth(int) | set Indicator slider width |  default value is 8dp|
+| BannerViewPager<T, VH> setIndicatorSliderWidth(int normalWidth, int checkWidth) | set indicator slider width| default value is 8dp |
+| BannerViewPager<T, VH> setIndicatorHeight(int) | set indicator slider height | default value is normalIndicatorSliderWidth/2 |
+| BannerViewPager<T, VH> setIndicatorSliderGap(int) | set space for indicator slider| default value is normalIndicatorSliderWidth|
+| BannerViewPager<T, VH> setIndicatorView(IIndicator) | set custom indicator|Custom indicator must extends BaseIndicatorView or implements IIndicator |
+| BannerViewPager<T, VH> setPageTransformer(ViewPager2.PageTransformer) | set page transformer,call this method will cover old transformer |  |
+| BannerViewPager<T, VH> addPageTransformer(ViewPager2.PageTransformer) | add page transformer | supported v3.0.0 |
+| BannerViewPager<T, VH> removeTransformer(ViewPager2.PageTransformer) | Remvoe page transformer | supported v3.0.0 |
+| BannerViewPager<T, VH> setCurrentItem(int) | Set the currently selected page. | supported v2.3.5|
+| int getCurrentItem() | return current position | Supported v2.3.5 |
+| BannerViewPager<T, VH> setPageStyle(PageStyle) | set page style for BVP | supported v2.4.0 enum(MULTI_PAGE、MULTI_PAGE_SCALE、MULTI_PAGE_OVERLAP)|
+| BannerViewPager<T, VH> setPageMargin(int) |  | supported v2.4.0 |
+| BannerViewPager<T, VH> setIndicatorMargin(int left, int top, int right, int bottom) | set margin for indicator | supported v2.4.1 |
+| BannerViewPager<T, VH> registerOnPageChangeCallback(OnPageChangeListener) | Set a callback that will be invoked whenever the page changes or is incrementally scrolled. |  |
+| BannerViewPager<T, VH> setRoundRect(int) | set round corner for BVP| Require SDK_INT>=LOLLIPOP |
+| BannerViewPager<T, VH> setOrientation(int) | Sets the orientation of the BVP| support in v3.0.0 {@link #ORIENTATION_HORIZONTAL} or {@link #ORIENTATION_VERTICAL} |
+| BannerViewPager<T, VH> setUserInputEnabled(int) | Enable or disable user initiated scrolling | |
+| void startLoop() |start loop | Don't need call this method while init BVP |
+| void stopLoop() | Stop loop | |
+| List\<T> getData() | return data in BVP |  |
+| void create(List<T> list) |Create BannerViewPager with data  | If data has fetched while you setup BannerViewPager,you can call this method |
+| void create() |Create BannerViewPager with no data  | If there is no data while you setup BannerViewPager(for example,The data is from remote server),you can call this method.Then,while you get data successfully,just need call refreData() method to refresh |
 ### Attributes
 
 | Attributes | format | description |
 |--|--|--|
-| bvp_interval | integer | 自动轮播时间间隔 |
-| bvp_scroll_duration | integer | 页面切换时滑动时间|
-| bvp_can_loop | boolean| 是否循环 |
-| bvp_auto_play | boolean | 是否自动播放  |
-| bvp_indicator_checked_color | color | indicator选中时颜色 |
-| bvp_indicator_normal_color | color | indicator未选中时颜色 |
-| bvp_indicator_radius | dimension | indicator圆点半径或者Dash模式的1/2宽度  |
-| bvp_round_corner| dimension  | Banner圆角大小 |
-| bvp_page_margin | dimension | 页面item间距 |
-| bvp_reveal_width | dimension | 一屏多页模式下两边item漏出的宽度 |
-| bvp_indicator_style | enum | indicator样式(circle/dash)  |
-| bvp_indicator_slide_mode | enum | indicator滑动模式(normal;smooth;worm) |
-| bvp_indicator_gravity | enum | indicator位置(center/start/end) |
-| bvp_page_style | enum | page样式(normal/multi_page/multi_page_overlap/multi_page_scale) |
+| bvp_interval | integer | set the interval of item switch |
+| bvp_scroll_duration | integer | set item scroll duration|
+| bvp_can_loop | boolean| set BVP can cycle  |
+| bvp_auto_play | boolean | set BVP can auto play  |
+| bvp_indicator_checked_color | color | set checked color for indicator slider |
+| bvp_indicator_normal_color | color | set normal color for indicator slider |
+| bvp_indicator_radius | dimension | if it's circle style the value is radius of circle,if the indicator style is DASH or ROUND_RECT the value is width/2   |
+| bvp_round_corner| dimension  | set round corner for BVP |
+| bvp_page_margin | dimension | set item margin |
+| bvp_reveal_width | dimension | it's only used when the page style is MULTI_PAGE/MULTI_PAGE_SCALE/MULTI_PAGE_OVERLAP,the value is two side item reveal width  |
+| bvp_indicator_style | enum | indicator style(circle/dash/round_rect)  |
+| bvp_indicator_slide_mode | enum | indicator slide mode(normal;smooth;worm;color;scale) |
+| bvp_indicator_gravity | enum | indicator gravity(center/start/end) |
+| bvp_page_style | enum | page style(normal/multi_page/multi_page_overlap/multi_page_scale) |
 | bvp_indicator_visibility| enum | indicator visibility(visible/gone/invisible) |
 
 
@@ -243,10 +247,12 @@ public class HomeAdapter extends BaseBannerAdapter<BannerData, NetViewHolder> {
 
 ### 5.Use in Activity or Fragment:
 
+  If data has fetched when create BannerViewPager,you can call create(List) method with parameter.
+ #### Java code
 ```
-    private BannerViewPager<CustomBean, NetViewHolder> mBannerViewPager;
+    private BannerViewPager<CustomBean, NetViewHolder> mViewPager;
     ...
-	private void initViewPager() {
+	private void setupViewPager() {
              mBannerViewPager = findViewById(R.id.banner_view);
              mViewPager
                       .setAutoPlay(true)
@@ -261,13 +267,74 @@ public class HomeAdapter extends BaseBannerAdapter<BannerData, NetViewHolder> {
                       .registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
                           @Override
                           public void onPageSelected(int position) {
-                              super.onPageSelected(position);
-                              BannerData bannerData = mViewPagerHorizontal.getData().get(position);
-                              mTvTitle.setText(bannerData.getTitle());
+                              BannerUtils.log("position:$position");
                           }
                       }).create(getPicList(4));
         }
 ```
+#### Kotlin Code
+
+```
+    private lateinit var mViewPager: BannerViewPager<CustomBean, NetViewHolder>
+    ...
+
+    private fun setupViewPager() {
+            mViewPager = findViewById(R.id.banner_view)
+            mViewPager.apply {
+                adapter = HomeAdapter()
+                setAutoPlay(true)
+                setIndicatorStyle(IndicatorStyle.ROUND_RECT)
+                setIndicatorSliderGap(getResources().getDimensionPixelOffset(R.dimen.dp_4))
+                setIndicatorMargin(0, 0, 0, resources.getDimension(R.dimen.dp_100).toInt())
+                setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
+                setIndicatorSliderRadius(resources.getDimension(R.dimen.dp_3).toInt(), resources.getDimension(R.dimen.dp_4_5).toInt())
+                setIndicatorSliderColor(ContextCompat.getColor(this@WelcomeActivity, R.color.white),
+                        ContextCompat.getColor(this@WelcomeActivity, R.color.white_alpha_75))
+                registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
+                                     override fun onPageSelected(position: Int) {
+                                         BannerUtils.log("position:$position")
+                                     }
+                                 })
+            }.create(data)
+        }
+
+```
+
+If there is no data while create BannerViewPager(for example,The data is from remote server),you can call create() method with no parameters:
+
+```
+    private lateinit var mViewPager: BannerViewPager<CustomBean, NetViewHolder>
+    ...
+
+    private fun setupViewPager() {
+            mViewPager = findViewById(R.id.banner_view)
+            mViewPager.apply {
+                adapter = HomeAdapter()
+                setAutoPlay(true)
+                setIndicatorStyle(IndicatorStyle.ROUND_RECT)
+                setIndicatorSliderGap(getResources().getDimensionPixelOffset(R.dimen.dp_4))
+                setIndicatorMargin(0, 0, 0, resources.getDimension(R.dimen.dp_100).toInt())
+                setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
+                setIndicatorSliderRadius(resources.getDimension(R.dimen.dp_3).toInt(), resources.getDimension(R.dimen.dp_4_5).toInt())
+                setIndicatorSliderColor(ContextCompat.getColor(this@WelcomeActivity, R.color.white),
+                        ContextCompat.getColor(this@WelcomeActivity, R.color.white_alpha_75))
+                registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
+                                     override fun onPageSelected(position: Int) {
+                                         BannerUtils.log("position:$position")
+                                     }
+                                 })
+            }.create()
+        }
+
+```
+
+Then,while you get data successfully,just need call refreData() method to refresh:
+
+```
+    mViewPager.refreshData(data)
+```
+
+
 ### 6.startLoop and stopLoop
 
 ***If the version you used is later than 2.5.0,you don't need care of startLoop and stopLoop in Activity or Fragment. But the two methods is still public.***

+ 74 - 7
README_CN.md

@@ -5,6 +5,7 @@
 [![JitPack](https://jitpack.io/v/zhpanvip/BannerViewPager.svg)](https://jitpack.io/#zhpanvip/BannerViewPager)
 [ ![JCenter](https://api.bintray.com/packages/zhpanvip/CircleViewPager/bannerview/images/download.svg) ](https://bintray.com/zhpanvip/CircleViewPager/bannerview/_latestVersion)
 [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-BannerViewPager-brightgreen.svg?style=flat)](https://android-arsenal.com/details/1/7961)
+[![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-ViewPagerIndicator-brightgreen.svg?style=flat)](https://github.com/zhpanvip/viewpagerindicator)
 
 ## [English](https://github.com/zhpanvip/BannerViewPager) | 中文
 
@@ -25,6 +26,8 @@
 - 移除setPageTransformerStyle
 - 移除部分2.x版本已废弃的方法
 - 不再支持android support.
+- 新增Indicator SCALE与COLOR滑动样式(V3.1.0)
+- 支持刷新通过refreshData()方法刷新数据(V3.1.0)
 
 ## 效果预览
 
@@ -41,7 +44,7 @@
 |--|--|--|
 | ![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 
+### 2.[Indicator](https://github.com/zhpanvip/viewpagerindicator)
 
 目前指示器已经从BannerViewPager中分离出来,现在单独为一个仓库,新的仓库地址为[ViewPagerIndicator](https://github.com/zhpanvip/viewpagerindicator),你可以点击连接了解更多关于[ViewPagerIndicator](https://github.com/zhpanvip/viewpagerindicator)的信息。
 
@@ -83,7 +86,7 @@ BannerViewPager目前已支持三种IndicatorViewStyle,以及三种IndicatorSlid
 | BannerViewPager<T, VH> setIndicatorStyle(int) | 设置指示器样式 | 可选枚举(CIRCLE, DASH、ROUND_RECT) 默认CIRCLE  |
 | BannerViewPager<T, VH> setIndicatorGravity(int) | 指示器位置 |可选值(CENTER、START、END)默认值CENTER |
 | BannerViewPager<T, VH> setIndicatorColor(int,int) | 指示器圆点颜色 |normalColor:未选中时颜色默认"#8C6C6D72", checkedColor:选中时颜色 默认"#8C18171C" |
-| BannerViewPager<T, VH> setIndicatorSlideMode(int slideMode)  | 设置Indicator滑动模式 | 可选(NORMAL、SMOOTH、WORM),默认值NORMAL  |
+| BannerViewPager<T, VH> setIndicatorSlideMode(int slideMode)  | 设置Indicator滑动模式 | 可选(NORMAL、SMOOTH、WORM、COLOR、SCALE),默认值NORMAL  |
 | BannerViewPager<T, VH> setIndicatorSliderRadius(int radius) | 设置指示器圆点半径 | 默认值4dp|
 | BannerViewPager<T, VH> setIndicatorSliderRadius(int normalRadius,int checkRadius)  |设置指示器圆点半径  |  normalRadius:未选中时半径  checkedRadius:选中时的半径,默认值4dp |
 | BannerViewPager<T, VH> setIndicatorSliderWidth(int) | 设置指示器宽度,如果是圆形指示器,则为直径 |  默认值8dp|
@@ -106,8 +109,8 @@ BannerViewPager目前已支持三种IndicatorViewStyle,以及三种IndicatorSlid
 | void startLoop() |开启自动轮播 | 初始化BannerViewPager时不必调用该方法,设置setAutoPlay后会调用startLoop() |
 | void stopLoop() | 停止自动轮播 | |
 | List\<T> getData() | 获取Banner中的集合数据 |  |
-| void create(List<T> list) |初始化并构造BannerViewPager  |必须调用,否则前面设置的参数无效  |
-
+| void create(List<T> list) |初始化并构造BannerViewPager  |如果创建BannerViewPager时已经有数据可以调用此方法  |
+| void create() |创建没有数据的BannerViewPager  | 如果创建BannerViewPager时还没有数据,比如数据是来自服务器,可以调用此方法,等到成功获取数据后调用refreshData()刷新数据  |
 ### xml支持的attrs
 | Attributes | format | description |
 |--|--|--|
@@ -121,8 +124,8 @@ BannerViewPager目前已支持三种IndicatorViewStyle,以及三种IndicatorSlid
 | bvp_round_corner| dimension  | Banner圆角大小 |
 | bvp_page_margin | dimension | 页面item间距 |
 | bvp_reveal_width | dimension | 一屏多页模式下两边item漏出的宽度 |
-| bvp_indicator_style | enum | indicator样式(circle/dash)  |
-| bvp_indicator_slide_mode | enum | indicator滑动模式(normal;smooth;worm) |
+| bvp_indicator_style | enum | indicator样式(circle/dash/round_rect)  |
+| bvp_indicator_slide_mode | enum | indicator滑动模式(normal;smooth;worm;color;scale) |
 | bvp_indicator_gravity | enum | indicator位置(center/start/end) |
 | bvp_page_style | enum | page样式(normal/multi_page/multi_page_overlap/multi_page_scale) |
 | bvp_indicator_visibility| enum | indicator visibility(visible/gone/invisible) |
@@ -242,10 +245,11 @@ public class HomeAdapter extends BaseBannerAdapter<BannerData, NetViewHolder> {
 
 ### 5.BannerViewPager参数配置
 
+#### Java code
 ```
     private BannerViewPager<CustomBean, NetViewHolder> mViewPager;
     ...
-	private void initViewPager() {
+	private void setupViewPager() {
              mViewPager = findViewById(R.id.banner_view);
              mViewPager
                        .setAutoPlay(true)
@@ -267,6 +271,69 @@ public class HomeAdapter extends BaseBannerAdapter<BannerData, NetViewHolder> {
                        }).create(getPicList(4));
         }
 ```
+
+#### Kotlin Code
+
+```
+    private lateinit var mViewPager: BannerViewPager<CustomBean, NetViewHolder>
+    ...
+
+    private fun setupViewPager() {
+            mViewPager = findViewById(R.id.banner_view)
+            mViewPager.apply {
+                adapter = HomeAdapter()
+                setAutoPlay(true)
+                setIndicatorStyle(IndicatorStyle.ROUND_RECT)
+                setIndicatorSliderGap(getResources().getDimensionPixelOffset(R.dimen.dp_4))
+                setIndicatorMargin(0, 0, 0, resources.getDimension(R.dimen.dp_100).toInt())
+                setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
+                setIndicatorSliderRadius(resources.getDimension(R.dimen.dp_3).toInt(), resources.getDimension(R.dimen.dp_4_5).toInt())
+                setIndicatorSliderColor(ContextCompat.getColor(this@WelcomeActivity, R.color.white),
+                        ContextCompat.getColor(this@WelcomeActivity, R.color.white_alpha_75))
+                registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
+                    override fun onPageSelected(position: Int) {
+                        BannerUtils.log("position:$position")
+                    }
+                })
+            }.create(data)
+        }
+
+```
+
+如果在创建BannerViewPager时不能拿到数据(例如数据是来自远程服务器),则可以调用不带参数的create()方法。代码如下:
+
+```
+    private lateinit var mViewPager: BannerViewPager<CustomBean, NetViewHolder>
+    ...
+
+    private fun setupViewPager() {
+            mViewPager = findViewById(R.id.banner_view)
+            mViewPager.apply {
+                adapter = HomeAdapter()
+                setAutoPlay(true)
+                setIndicatorStyle(IndicatorStyle.ROUND_RECT)
+                setIndicatorSliderGap(getResources().getDimensionPixelOffset(R.dimen.dp_4))
+                setIndicatorMargin(0, 0, 0, resources.getDimension(R.dimen.dp_100).toInt())
+                setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
+                setIndicatorSliderRadius(resources.getDimension(R.dimen.dp_3).toInt(), resources.getDimension(R.dimen.dp_4_5).toInt())
+                setIndicatorSliderColor(ContextCompat.getColor(this@WelcomeActivity, R.color.white),
+                        ContextCompat.getColor(this@WelcomeActivity, R.color.white_alpha_75))
+                registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
+                    override fun onPageSelected(position: Int) {
+                        BannerUtils.log("position:$position")
+                    }
+                })
+            }.create()
+        }
+
+```
+
+当成功拿到数据后再调用refreshData()方法刷新数据:
+
+```
+    mViewPager.refreshData(data)
+```
+
 ### 6.开启与停止轮播
 
 ***2.5.0之后版本无需自行在Activity或Fragment中管理stopLoop和startLoop方法,但这两个方法依旧保留对外开放***

BIN
app/release/app-release.apk


+ 10 - 9
app/src/main/java/com/example/zhpan/circleviewpager/activity/MainActivity.kt

@@ -23,15 +23,16 @@ class MainActivity : AppCompatActivity() {
     }
 
     private fun initData() {
-        vp_fragment.adapter = AdapterFragmentPager(this)
-        vp_fragment.offscreenPageLimit = 3
-        vp_fragment.isUserInputEnabled = true
-        vp_fragment.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
-            override fun onPageSelected(position: Int) {
-                super.onPageSelected(position)
-                rg_tab?.check(getCheckedId(position))
-            }
-        })
+        with(vp_fragment) {
+            adapter = AdapterFragmentPager(this@MainActivity)
+            isUserInputEnabled = true
+            registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
+                override fun onPageSelected(position: Int) {
+                    super.onPageSelected(position)
+                    rg_tab?.check(getCheckedId(position))
+                }
+            })
+        }
     }
 
     private fun getCheckedId(position: Int): Int {

+ 7 - 5
app/src/main/java/com/example/zhpan/circleviewpager/activity/PhotoViewActivity.kt

@@ -19,10 +19,12 @@ class PhotoViewActivity : BaseDataActivity() {
 
     private fun initViewPager() {
         val bannerViewPager = findViewById<BannerViewPager<Int, PhotoViewHolder>>(R.id.viewpager)
-        bannerViewPager.setAutoPlay(false)
-                .setCanLoop(false)
-                .setAdapter(PhotoAdapter())
-                .create(mDrawableList)
-        bannerViewPager.setCurrentItem(1,false);
+
+        bannerViewPager.apply {
+            adapter = PhotoAdapter()
+            setCanLoop(false)
+        }.create(mDrawableList)
+
+        bannerViewPager.setCurrentItem(1, false)
     }
 }

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

@@ -49,25 +49,25 @@ class WelcomeActivity : BaseDataActivity() {
 
     private fun setupViewPager() {
         mViewPager = findViewById(R.id.viewpager)
-        val welcomeAdapter = WelcomeAdapter()
-        welcomeAdapter.mOnSubViewClickListener = CustomPageViewHolder.OnSubViewClickListener { _, position -> ToastUtils.show("Logo Clicked,position:$position") }
-        mViewPager.setAutoPlay(false)
-                .setCanLoop(false)
-                .setPageTransformer(PageTransformerFactory.createPageTransformer(Random().nextInt(6)))
-                .setIndicatorMargin(0, 0, 0, resources.getDimension(R.dimen.dp_100).toInt())
-                .setIndicatorSliderGap(resources.getDimension(R.dimen.dp_10).toInt())
-                .setIndicatorSliderColor(ContextCompat.getColor(this, R.color.white),
-                        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())
-                .setAdapter(welcomeAdapter)
-                .registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
-                    override fun onPageSelected(position: Int) {
-                        BannerUtils.log("position:$position")
-                        updateUI(position)
-                    }
-                })
-                .create(data)
+        mViewPager.apply {
+            setCanLoop(false)
+            setPageTransformer(PageTransformerFactory.createPageTransformer(transforms[Random().nextInt(6)]))
+            setIndicatorMargin(0, 0, 0, resources.getDimension(R.dimen.dp_100).toInt())
+            setIndicatorSliderGap(resources.getDimension(R.dimen.dp_10).toInt())
+            setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
+            setIndicatorSliderRadius(resources.getDimension(R.dimen.dp_3).toInt(), resources.getDimension(R.dimen.dp_4_5).toInt())
+            registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
+                override fun onPageSelected(position: Int) {
+                    BannerUtils.log("position:$position")
+                    updateUI(position)
+                }
+            })
+            adapter = WelcomeAdapter().apply {
+                mOnSubViewClickListener = CustomPageViewHolder.OnSubViewClickListener { _, position -> ToastUtils.show("Logo Clicked,position:$position") }
+            }
+            setIndicatorSliderColor(ContextCompat.getColor(this@WelcomeActivity, R.color.white),
+                    ContextCompat.getColor(this@WelcomeActivity, R.color.white_alpha_75))
+        }.create(data)
     }
 
     fun onClick(view: View) {

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

@@ -74,7 +74,6 @@ public class HomeFragment extends BaseFragment {
         if (mViewPagerVertical != null) {
             mViewPagerVertical.stopLoop();
         }
-
     }
 
     @Override
@@ -132,7 +131,7 @@ public class HomeFragment extends BaseFragment {
                         bannerData.setType(BannerData.TYPE_NEW);
                         bannerData.setTitle("这是一个自定义类型");
                         dataList.add(1, bannerData);
-                        mViewPagerHorizontal.setData(dataList);
+                        mViewPagerHorizontal.refreshData(dataList);
                         List<ArticleWrapper.Article> articleList = response.getArticleList();
                         ArticleWrapper.Article article = new ArticleWrapper.Article();
                         article.setType(1001);
@@ -140,7 +139,6 @@ public class HomeFragment extends BaseFragment {
                         articleList.add(4, article);
                         articleAdapter.setData(articleList);
                         if (response.getDataBeanList().size() > 0) {
-                            mTvTitle.setText(response.getDataBeanList().get(0).getTitle());
                             mRlIndicator.setVisibility(View.VISIBLE);
                         }
                     }
@@ -165,7 +163,6 @@ public class HomeFragment extends BaseFragment {
     private void initBanner() {
         HomeAdapter homeAdapter = new HomeAdapter();
         mViewPagerHorizontal
-                .setAutoPlay(true)
                 .setScrollDuration(600)
                 .setIndicatorStyle(IndicatorStyle.CIRCLE)
                 .setIndicatorSlideMode(IndicatorSlideMode.WORM)
@@ -183,7 +180,7 @@ public class HomeFragment extends BaseFragment {
                         mTvTitle.setText(bannerData.getTitle());
                     }
                 })
-                .setOnPageClickListener(this::onPageClicked);
+                .setOnPageClickListener(this::onPageClicked).create();
 
         mViewPagerVertical
                 .setAutoPlay(true)

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

@@ -7,11 +7,15 @@ import android.view.View;
 import android.widget.RadioButton;
 import android.widget.RadioGroup;
 
+import androidx.annotation.NonNull;
+
 import com.example.zhpan.circleviewpager.R;
 import com.example.zhpan.circleviewpager.activity.PhotoViewActivity;
 import com.example.zhpan.circleviewpager.adapter.ImageResourceAdapter;
 import com.example.zhpan.circleviewpager.view.FigureIndicatorView;
 import com.example.zhpan.circleviewpager.viewholder.ImageResourceViewHolder;
+import com.scwang.smartrefresh.header.MaterialHeader;
+import com.scwang.smartrefresh.layout.SmartRefreshLayout;
 import com.zhpan.bannerview.BannerViewPager;
 import com.zhpan.bannerview.constants.IndicatorGravity;
 import com.zhpan.bannerview.utils.BannerUtils;
@@ -34,6 +38,7 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
     private RadioGroup radioGroupStyle;
     private RadioButton radioButton;
     private IndicatorView mIndicatorView;
+    private SmartRefreshLayout mSmartRefreshLayout;
 
     public static OthersFragment getInstance() {
         return new OthersFragment();
@@ -49,6 +54,15 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
 
     }
 
+    private void initRefreshLayout(View view) {
+        mSmartRefreshLayout = view.findViewById(R.id.refresh_layout);
+        mSmartRefreshLayout.setRefreshHeader(new MaterialHeader(getMContext()));
+        mSmartRefreshLayout.setOnRefreshListener(refreshLayout -> {
+            updateData();
+            mSmartRefreshLayout.finishRefresh();
+        });
+    }
+
     @Override
     public void onPause() {
         super.onPause();
@@ -66,13 +80,13 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
     }
 
     @Override
-    protected void initView(Bundle savedInstanceState, View view) {
+    protected void initView(Bundle savedInstanceState, @NonNull View view) {
+        initRefreshLayout(view);
         radioButton = view.findViewById(R.id.rb_indicator_below);
         radioGroupStyle = view.findViewById(R.id.rg_indicator_style);
         mViewPager = view.findViewById(R.id.banner_view);
         mIndicatorView = view.findViewById(R.id.indicator_view);
         view.findViewById(R.id.tv_photo_view).setOnClickListener(this);
-        view.findViewById(R.id.btn_refresh).setOnClickListener(v -> updateData());
         mViewPager.setIndicatorSliderGap(BannerUtils.dp2px(6))
                 .setRoundCorner(BannerUtils.dp2px(6))
                 .setOnPageClickListener(position -> {
@@ -140,7 +154,6 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
         mIndicatorView.setVisibility(View.VISIBLE);
         mViewPager
                 .setIndicatorSlideMode(IndicatorSlideMode.SMOOTH)
-                .setIndicatorVisibility(View.GONE)
                 .setIndicatorView(mIndicatorView)
                 .create(getPicList(4));
     }
@@ -167,9 +180,8 @@ public class OthersFragment extends BaseFragment implements View.OnClickListener
     }
 
     private void updateData() {
-        mViewPager.setData(getPicList(new Random().nextInt(5)));
+        mViewPager.refreshData(getPicList(new Random().nextInt(5) - 1));
         ToastUtils.show("size=" + mViewPager.getData().size());
-
     }
 
     @Override

+ 83 - 90
app/src/main/res/layout/fragment_others.xml

@@ -1,113 +1,106 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+<com.scwang.smartrefresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/refresh_layout"
     android:layout_width="match_parent"
-    android:layout_height="match_parent">
+    android:layout_height="match_parent"
+    android:overScrollMode="never">
 
-    <RelativeLayout
+    <androidx.core.widget.NestedScrollView
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical">
+        android:layout_height="match_parent">
 
-        <com.zhpan.bannerview.BannerViewPager
-            android:id="@+id/banner_view"
+        <RelativeLayout
             android:layout_width="match_parent"
-            android:layout_height="@dimen/dp_180"
-            android:layout_margin="@dimen/dp_10"
-            app:bvp_indicator_visibility="visible"
-            app:bvp_round_corner="@dimen/dp_8" />
+            android:layout_height="match_parent"
+            android:orientation="vertical">
 
-        <com.zhpan.indicator.IndicatorView
-            android:id="@+id/indicator_view"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@id/banner_view"
-            android:layout_centerHorizontal="true" />
+            <com.zhpan.bannerview.BannerViewPager
+                android:id="@+id/banner_view"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/dp_180"
+                android:layout_margin="@dimen/dp_10"
+                app:bvp_indicator_visibility="visible"
+                app:bvp_round_corner="@dimen/dp_8" />
 
-        <TextView
-            android:id="@+id/tv_page_style"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_below="@id/indicator_view"
-            android:layout_marginStart="@dimen/dp_10"
-            android:layout_marginTop="@dimen/dp_10"
-            android:text="@string/custom_style"
-            android:textColor="#000000"
-            android:textSize="@dimen/sp_18"
-            android:textStyle="bold" />
-
-        <RadioGroup
-            android:id="@+id/rg_indicator_style"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_below="@id/tv_page_style"
-            android:orientation="vertical"
-            android:padding="@dimen/dp_15">
-
-            <RadioButton
-                android:id="@+id/rb_indicator_below"
+            <com.zhpan.indicator.IndicatorView
+                android:id="@+id/indicator_view"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginEnd="@dimen/dp_15"
-                android:layout_marginBottom="@dimen/dp_10"
-                android:text="Indicator below of Banner"
-                android:textSize="@dimen/sp_16" />
+                android:layout_below="@id/banner_view"
+                android:layout_centerHorizontal="true" />
 
-            <RadioButton
-                android:id="@+id/rb_dash"
+            <TextView
+                android:id="@+id/tv_page_style"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginEnd="@dimen/dp_15"
-                android:layout_marginBottom="@dimen/dp_10"
-                android:text="Custom Indicator"
-                android:textSize="@dimen/sp_16" />
+                android:layout_below="@id/indicator_view"
+                android:layout_marginStart="@dimen/dp_10"
+                android:layout_marginTop="@dimen/dp_10"
+                android:text="@string/custom_style"
+                android:textColor="#000000"
+                android:textSize="@dimen/sp_18"
+                android:textStyle="bold" />
 
-            <RadioButton
-                android:id="@+id/rb_drawable"
-                android:layout_width="wrap_content"
+            <RadioGroup
+                android:id="@+id/rg_indicator_style"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginEnd="15dp"
-                android:layout_marginBottom="@dimen/dp_10"
-                android:text="Drawable Indicator(BitmapDrawable)"
-                android:textSize="@dimen/sp_16" />
+                android:layout_below="@id/tv_page_style"
+                android:orientation="vertical"
+                android:padding="@dimen/dp_15">
 
-            <RadioButton
-                android:id="@+id/rb_vector_drawable"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_marginEnd="15dp"
-                android:layout_marginBottom="@dimen/dp_10"
-                android:text="Drawable Indicator(VectorDrawable)"
-                android:textSize="@dimen/sp_16" />
+                <RadioButton
+                    android:id="@+id/rb_indicator_below"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="@dimen/dp_15"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:text="Indicator below of Banner"
+                    android:textSize="@dimen/sp_16" />
 
-        </RadioGroup>
+                <RadioButton
+                    android:id="@+id/rb_dash"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="@dimen/dp_15"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:text="Custom Indicator"
+                    android:textSize="@dimen/sp_16" />
 
-        <TextView
-            android:id="@+id/btn_refresh"
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/dp_45"
-            android:layout_below="@id/rg_indicator_style"
-            android:layout_centerHorizontal="true"
-            android:background="@color/white"
-            android:gravity="center"
-            android:text="Refresh"
-            android:textColor="#000000"
-            android:textSize="@dimen/sp_16" />
+                <RadioButton
+                    android:id="@+id/rb_drawable"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="15dp"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:text="Drawable Indicator(BitmapDrawable)"
+                    android:textSize="@dimen/sp_16" />
 
-        <TextView
-            android:id="@+id/tv_photo_view"
-            android:layout_width="match_parent"
-            android:layout_height="@dimen/dp_45"
-            android:layout_below="@id/btn_refresh"
-            android:background="@color/white"
-            android:gravity="center"
-            android:layout_marginTop="@dimen/dp_10"
-            android:onClick="onClick"
-            android:text="@string/wrapper_photo_view"
-            android:textColor="#000000"
-            android:textSize="@dimen/sp_16" />
+                <RadioButton
+                    android:id="@+id/rb_vector_drawable"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginEnd="15dp"
+                    android:layout_marginBottom="@dimen/dp_10"
+                    android:text="Drawable Indicator(VectorDrawable)"
+                    android:textSize="@dimen/sp_16" />
 
+            </RadioGroup>
 
+            <TextView
+                android:id="@+id/tv_photo_view"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/dp_45"
+                android:layout_below="@id/rg_indicator_style"
+                android:layout_marginTop="@dimen/dp_10"
+                android:background="@color/white"
+                android:gravity="center"
+                android:onClick="onClick"
+                android:text="@string/wrapper_photo_view"
+                android:textColor="#000000"
+                android:textSize="@dimen/sp_16" />
 
-    </RelativeLayout>
-</androidx.core.widget.NestedScrollView>
+        </RelativeLayout>
+    </androidx.core.widget.NestedScrollView>
+</com.scwang.smartrefresh.layout.SmartRefreshLayout>

+ 41 - 7
bannerview/src/main/java/com/zhpan/bannerview/BannerViewPager.java

@@ -32,7 +32,9 @@ import com.zhpan.indicator.IndicatorView;
 import com.zhpan.indicator.annotation.AIndicatorSlideMode;
 import com.zhpan.indicator.annotation.AIndicatorStyle;
 import com.zhpan.indicator.base.IIndicator;
+import com.zhpan.indicator.option.IndicatorOptions;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import static com.zhpan.bannerview.BaseBannerAdapter.MAX_VALUE;
@@ -185,7 +187,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
 
     @Override
     public boolean onInterceptTouchEvent(MotionEvent ev) {
-        if (!mViewPager.isUserInputEnabled()) {
+        if (!mViewPager.isUserInputEnabled() || mBannerPagerAdapter.getData().size() <= 1) {
             return super.onInterceptTouchEvent(ev);
         }
         switch (ev.getAction()) {
@@ -254,8 +256,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
 
     private void handlePosition() {
         if (mBannerPagerAdapter.getListSize() > 1) {
-            currentPosition = mViewPager.getCurrentItem() + 1;
-            mViewPager.setCurrentItem(currentPosition);
+            mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);
             mHandler.postDelayed(mRunnable, getInterval());
         }
     }
@@ -270,6 +271,11 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
     }
 
     private void setIndicatorValues(List<T> list) {
+        int indicatorVisibility = mBannerManager.getBannerOptions().getIndicatorVisibility();
+        if (indicatorVisibility == View.GONE || indicatorVisibility == View.INVISIBLE) {
+            return;
+        }
+        mIndicatorLayout.setVisibility(indicatorVisibility);
         BannerOptions bannerOptions = mBannerManager.getBannerOptions();
         bannerOptions.resetIndicatorOptions();
         if (isCustomIndicator && null != mIndicatorView) {
@@ -283,7 +289,6 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
     }
 
     private void initIndicator(IIndicator indicatorView) {
-        mIndicatorLayout.setVisibility(mBannerManager.getBannerOptions().getIndicatorVisibility());
         mIndicatorView = indicatorView;
         if (((View) mIndicatorView).getParent() == null) {
             mIndicatorLayout.removeAllViews();
@@ -697,6 +702,10 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
         return this;
     }
 
+    /**
+     * Create BannerViewPager with data.
+     * If data has fetched when create BannerViewPager,you can call this method.
+     */
     public void create(List<T> data) {
         if (mBannerPagerAdapter == null) {
             throw new NullPointerException("You must set adapter for BannerViewPager");
@@ -705,6 +714,15 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
         initBannerData();
     }
 
+    /**
+     * Create BannerViewPager with no data
+     * If there is no data while you create BannerViewPager(for example,The data is from remote server),you can call this method.
+     * Then,while you fetch data successfully,just need call {@link #refreshData(List)} method to refresh.
+     */
+    public void create() {
+        create(new ArrayList<T>());
+    }
+
     /**
      * Sets the orientation of the ViewPager2.
      *
@@ -716,10 +734,23 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
         return this;
     }
 
-    public void setData(List<T> list) {
+    /**
+     * Refresh data.
+     * Confirm the {@link #create()} or {@link #create(List)} method has been called,
+     * else the data won't be shown.
+     */
+    public void refreshData(List<T> list) {
         if (list != null && mBannerPagerAdapter != null) {
             mBannerPagerAdapter.setData(list);
-            initBannerData();
+            mBannerPagerAdapter.notifyDataSetChanged();
+            setCurrentItem(getCurrentItem(), false);
+            if (mIndicatorView != null) {
+                IndicatorOptions indicatorOptions = mBannerManager.getBannerOptions().getIndicatorOptions();
+                indicatorOptions.setPageSize(list.size());
+                indicatorOptions.setCurrentPosition(BannerUtils.getRealPosition(isCanLoop(), mViewPager.getCurrentItem(), list.size()));
+                mIndicatorView.notifyDataChanged();
+            }
+            startLoop();
         }
     }
 
@@ -786,7 +817,7 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
     }
 
     /**
-     * 建议使用默认的offScreenPageLimit
+     * Suggest to use default offScreenPageLimit.
      */
     public BannerViewPager<T, VH> setOffScreenPageLimit(int offScreenPageLimit) {
         mBannerManager.getBannerOptions().setOffScreenPageLimit(offScreenPageLimit);
@@ -799,6 +830,9 @@ public class BannerViewPager<T, VH extends BaseViewHolder<T>> extends RelativeLa
         return this;
     }
 
+    /**
+     * Enable or disable user initiated scrolling
+     */
     public BannerViewPager<T, VH> setUserInputEnabled(boolean userInputEnabled) {
         mBannerManager.getBannerOptions().setUserInputEnabled(userInputEnabled);
         return this;

+ 3 - 1
bannerview/src/main/java/com/zhpan/bannerview/manager/BannerOptions.java

@@ -1,5 +1,7 @@
 package com.zhpan.bannerview.manager;
 
+import android.view.View;
+
 import androidx.viewpager2.widget.ViewPager2;
 
 import com.zhpan.bannerview.constants.PageStyle;
@@ -42,7 +44,7 @@ public class BannerOptions {
 
     private IndicatorMargin mIndicatorMargin;
 
-    private int mIndicatorVisibility;
+    private int mIndicatorVisibility= View.VISIBLE;
 
     private int scrollDuration;
 

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

@@ -9,7 +9,7 @@ import java.lang.reflect.Field;
 
 
 /**
- * source form:https://github.com/youth5201314/banner/blob/master/banner/src/main/java/com/youth/banner/util/ScrollSpeedManger.java
+ * source from: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 {

+ 2 - 2
bannerview/src/main/java/com/zhpan/bannerview/transform/ScaleInTransformer.java

@@ -20,8 +20,8 @@ public class ScaleInTransformer implements ViewPager2.PageTransformer {
         int pageWidth = view.getWidth();
         int pageHeight = view.getHeight();
 
-        view.setPivotY(pageHeight / 2);
-        view.setPivotX(pageWidth / 2);
+        view.setPivotY(pageHeight / 2f);
+        view.setPivotX(pageWidth / 2f);
         if (position < -1) {
             // This page is way off-screen to the left.
             view.setScaleX(mMinScale);

+ 1 - 1
bannerview/src/main/java/com/zhpan/bannerview/utils/BannerUtils.java

@@ -38,7 +38,7 @@ public class BannerUtils {
     }
 
     public static int getRealPosition(boolean isCanLoop, int position, int pageSize) {
+        if (pageSize == 0) return 0;
         return isCanLoop ? (position - 1 + pageSize) % pageSize : (position + pageSize) % pageSize;
     }
-
 }