Skip to content

ViewPager1和ViewPager2

angcyo edited this page Dec 3, 2020 · 3 revisions

1.4.2之后, 可以使用:

implementation 'com.github.angcyo.DslTablayout:ViewPager1Delegate:1.4.2'
implementation 'com.github.angcyo.DslTablayout:ViewPager2Delegate:1.4.2'
ViewPager1Delegate.install(viewPager, dslTabLayout)
ViewPager2Delegate.install(viewPager2, dslTabLayout)

进行关联操作.


旧文如下:

为了兼容"androidx.viewpager:viewpager""androidx.viewpager2:viewpager2"

而又不想在库中强引入这2个库.

所以需要开发者自行转发onPageScrolled事件给DslTabLayout.


原来的方法setupViewPager(viewPager: ViewPager), 改成了setupViewPager(viewPagerDelegate: ViewPagerDelegate)

兼容ViewPager1

请使用以下的类:

/**
 * 兼容[ViewPager]
 * Email:angcyo@126.com
 * @author angcyo
 * @date 2019/12/14
 */
class ViewPager1Delegate(val viewPager: ViewPager, val dslTabLayout: DslTabLayout) :
    ViewPager.OnPageChangeListener, ViewPagerDelegate {

    init {
        viewPager.addOnPageChangeListener(this)
    }

    override fun onGetCurrentItem(): Int {
        return viewPager.currentItem
    }

    override fun onSetCurrentItem(fromIndex: Int, toIndex: Int) {
        viewPager.setCurrentItem(toIndex, (toIndex - fromIndex).absoluteValue <= 1)
    }

    override fun onPageScrollStateChanged(state: Int) {
        dslTabLayout.onPageScrollStateChanged(state)
    }

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
        dslTabLayout.onPageScrolled(position, positionOffset, positionOffsetPixels)
    }

    override fun onPageSelected(position: Int) {
        dslTabLayout.onPageSelected(position)
    }
}

兼容ViewPager2

请使用以下的类:

/**
 * 兼容[ViewPager2]
 * Email:angcyo@126.com
 * @author angcyo
 * @date 2019/12/14
 */
class ViewPager2Delegate(val viewPager: ViewPager2, val dslTabLayout: DslTabLayout) :
    ViewPager2.OnPageChangeCallback(), ViewPagerDelegate {

    init {
        viewPager.registerOnPageChangeCallback(this)
    }

    override fun onGetCurrentItem(): Int {
        return viewPager.currentItem
    }

    override fun onSetCurrentItem(fromIndex: Int, toIndex: Int) {
        viewPager.setCurrentItem(toIndex, (toIndex - fromIndex).absoluteValue <= 1)
    }

    override fun onPageScrollStateChanged(state: Int) {
        dslTabLayout.onPageScrollStateChanged(state)
    }

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
        dslTabLayout.onPageScrolled(position, positionOffset, positionOffsetPixels)
    }

    override fun onPageSelected(position: Int) {
        dslTabLayout.onPageSelected(position)
    }
}

本来想把这2个类打成library, 考虑到依赖库的版本冲突的原因, 先搁置以下.

注意

如果覆盖了onSelectIndexChange操作, 那么ViewPagerViewPager2的操作需要手动触发.

触发代码dslTablayout._viewPagerDelegate?.onSetCurrentItem(fromIndex, toIndex)

//如果设置[tabLayoutConfig?.onSelectIndexChange], 那么会覆盖[_viewPagerDelegate]的操作.
tabLayoutConfig?.onSelectIndexChange?.invoke(
    fromIndex,
    selectList,
    reselect,
    fromUser
) ?: _viewPagerDelegate?.onSetCurrentItem(fromIndex, toIndex)