-
-
Notifications
You must be signed in to change notification settings - Fork 447
06.快速开始
ZhangPan edited this page Mar 30, 2023
·
9 revisions
由于ViewPager2不支持Android support 库,因此BannerViewPager 3.0不再支持Android support,如果你仍在使用Android support,请移步v2.x版本
在项目的root build.gradle中添加如下配置:
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
在app的gradle中添加依赖:
implementation 'com.github.zhpanvip:bannerviewpager:latestVersion'
<com.zhpan.bannerview.BannerViewPager
android:id="@+id/banner_view"
android:layout_width="match_parent"
android:layout_margin="10dp"
android:layout_height="160dp" />
注意:Item的布局必须是"match_parent",否则ViewPager2会抛出一个IllegalStateException.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/banner_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop" />
</RelativeLayout>
class SimpleAdapter : BaseBannerAdapter<CustomBean>() {
override fun bindData(holder: BaseViewHolder<CustomBean>, data: CustomBean?, position: Int, pageSize: Int) {
holder.setImageResource(R.id.banner_image, data!!.imageRes)
}
override fun getLayoutId(viewType: Int): Int {
return R.layout.item_custom_view;
}
}
注意:不要在循环模式下使用{@link RecyclerView.ViewHolder#getAdapterPosition} 方法获取position,这个方法可能会返回一个不正确的position
如果你需要通过getAdapterPosition()方法获取position,可参考如下代码:
int adapterPosition = holder.getAdapterPosition();
int realPosition = BannerUtils.getRealPosition(isCanLoop, adapterPosition, mList.size());
如果是异步获取数据(例如从服务器或数据库获取数据),可以调用不带参数的create()方法:
private BannerViewPager<CustomBean> mViewPager;
...
private void setupViewPager() {
mViewPager = findViewById(R.id.banner_view);
mViewPager.setLifecycleRegistry(getLifecycle())
.setAdapter(new SimpleAdapter())
.create();
}
private lateinit var mViewPager: BannerViewPager<CustomBean>
...
private fun setupViewPager() {
mViewPager = findViewById(R.id.banner_view)
mViewPager.apply {
adapter = SimpleAdapter()
setLifecycleRegistry(lifecycle)
}.create()
}
当成功拿到数据后再调用refreshData()方法刷新数据:
mViewPager.refreshData(data)
如果是同步获取数据,则可以调用带参数的create方法,如下:
private lateinit var mViewPager: BannerViewPager<CustomBean>
...
private fun setupViewPager() {
mViewPager = findViewById(R.id.banner_view)
mViewPager.apply {
adapter = SimpleAdapter()
setLifecycleRegistry(lifecycle)
}.create(data)
}
至此,即可完成一个带有指示器的自动无限轮播的ViewPager。更多参数设置请参看API文档
使用setLifecycleRegistry(getLifecycle())方法替代在Activity或Fragment中调用startLoop和stopLoop
mViewPager.setLifecycleRegistry(getLifecycle())
// setLifecycleRegistry方法等同于以下代码
@Override
protected void onPause() {
if (mViewPager != null)
mViewPager.stopLoop();
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
if (mViewPager != null)
mViewPager.startLoop();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mViewPager != null)
mViewPager.stopLoop();
}
如果开启了混淆,并且调用了BVP的setScrollDuration方法,则必须添加以下混淆配置:
-keep class androidx.recyclerview.widget.**{*;}
-keep class androidx.viewpager2.widget.**{*;}