Skip to content

06.快速开始

ZhangPan edited this page Mar 30, 2023 · 9 revisions

由于ViewPager2不支持Android support 库,因此BannerViewPager 3.0不再支持Android support,如果你仍在使用Android support,请移步v2.x版本

(1)gradle中添加依赖

在项目的root build.gradle中添加如下配置:

allprojects {
		repositories {
			...
			maven { url 'https://www.jitpack.io' }
		}
	}
	

在app的gradle中添加依赖:

implementation 'com.github.zhpanvip:bannerviewpager:latestVersion'

latestVersion:latestVersion

(2)在xml文件中添加如下代码:

    <com.zhpan.bannerview.BannerViewPager
            android:id="@+id/banner_view"
            android:layout_width="match_parent"
            android:layout_margin="10dp"
            android:layout_height="160dp" />

(3)Banner的Item页面布局

注意: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>

(4)继承BaseBannerAdapter,并重写相关方法

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());

(5)构建BannerViewPager

如果是异步获取数据(例如从服务器或数据库获取数据),可以调用不带参数的create()方法:

Java code

    private BannerViewPager<CustomBean> mViewPager;
    ...
	private void setupViewPager() {
             mViewPager = findViewById(R.id.banner_view);
             mViewPager.setLifecycleRegistry(getLifecycle())
                       .setAdapter(new SimpleAdapter())
                       .create();
        }

Kotlin Code

    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文档

(6)开启与停止轮播

使用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();
    }

(7)混淆

如果开启了混淆,并且调用了BVP的setScrollDuration方法,则必须添加以下混淆配置:

    -keep class androidx.recyclerview.widget.**{*;}
    -keep class androidx.viewpager2.widget.**{*;}