使用RecyclerView實(shí)現(xiàn)抖音縱向滾動ViewPager效果,供大家參考,具體內(nèi)容如下

創(chuàng)新互聯(lián)建站始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達(dá)10余年累計超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的全網(wǎng)推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:成都航空箱等企業(yè),備受客戶贊美。
重寫LinearLayoutManager,在onAttachedToWindow方法中使用 PagerSnapHelper設(shè)置RecyclerView條目加載方式為每次滾動加載一頁
class MyLinearLayoutManager : LinearLayoutManager {
private lateinit var mPagerSnapHelper: PagerSnapHelper
private var mOnViewPagerListener: OnViewPagerListener? = null
private lateinit var mRecyclerView: RecyclerView
private var mDrift: Int = 0//位移,用來判斷移動方向
constructor(context: Context) : this(context, OrientationHelper.VERTICAL)
constructor(context: Context, orientation: Int) : this(context, orientation, false)
constructor(context: Context, orientation: Int, reverseLayout: Boolean) : super(context, orientation, reverseLayout) {
mPagerSnapHelper = PagerSnapHelper()
}
override fun onAttachedToWindow(view: RecyclerView) {
super.onAttachedToWindow(view)
mPagerSnapHelper.attachToRecyclerView(view)//設(shè)置RecyclerView每次滾動一頁
mRecyclerView = view
mRecyclerView.addOnChildAttachStateChangeListener(mChildAttachStateChangeListener)
}
/**
* 滑動狀態(tài)的改變
* 緩慢拖拽-> SCROLL_STATE_DRAGGING
* 快速滾動-> SCROLL_STATE_SETTLING
* 空閑狀態(tài)-> SCROLL_STATE_IDLE
* @param state
*/
override fun onScrollStateChanged(state: Int) {
if (state == RecyclerView.SCROLL_STATE_IDLE){
val viewIdle = mPagerSnapHelper.findSnapView(this)
val positionIdle = getPosition(viewIdle!!)
if (mOnViewPagerListener != null && childCount == 1) {
mOnViewPagerListener!!.onPageSelected(positionIdle, positionIdle == itemCount - 1)
}
}
}
/**
* 布局完成后調(diào)用
* @param state
*/
override fun onLayoutCompleted(state: RecyclerView.State?) {
super.onLayoutCompleted(state)
if (mOnViewPagerListener != null) mOnViewPagerListener!!.onLayoutComplete()
}
/**
* 監(jiān)聽豎直方向的相對偏移量
*/
override fun scrollVerticallyBy(dy: Int, recycler: RecyclerView.Recycler?, state: RecyclerView.State?): Int {
this.mDrift = dy
return super.scrollVerticallyBy(dy, recycler, state)
}
/**
* 監(jiān)聽水平方向的相對偏移量
*/
override fun scrollHorizontallyBy(dx: Int, recycler: RecyclerView.Recycler?, state: RecyclerView.State?): Int {
this.mDrift = dx
return super.scrollHorizontallyBy(dx, recycler, state)
}
/**
* 設(shè)置監(jiān)聽
* @param listener
*/
fun setOnViewPagerListener(listener: OnViewPagerListener) {
this.mOnViewPagerListener = listener
}
private val mChildAttachStateChangeListener = object : RecyclerView.OnChildAttachStateChangeListener {
override fun onChildViewAttachedToWindow(view: View) {
}
override fun onChildViewDetachedFromWindow(view: View) {
if (mDrift >= 0) {
if (mOnViewPagerListener != null) mOnViewPagerListener!!.onPageRelease(true, getPosition(view))
} else {
if (mOnViewPagerListener != null) mOnViewPagerListener!!.onPageRelease(false, getPosition(view))
}
}
}
interface OnViewPagerListener{
/*釋放的監(jiān)聽*/
fun onPageRelease(isNext: Boolean, position: Int)
/*選中的監(jiān)聽以及判斷是否滑動到底部*/
fun onPageSelected(position: Int, isBottom: Boolean)
/*布局完成的監(jiān)聽*/
fun onLayoutComplete()
}
}重寫RecyclerView條目內(nèi)容主布局滿屏填充
class MyImageView : ImageView {
constructor(context: Context) : this(context, null!!)
constructor(context: Context, attr: AttributeSet) : this(context, attr, 0)
constructor(context: Context, attr: AttributeSet, defStyleAttr: Int) : super(context, attr, defStyleAttr)
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val width = View.getDefaultSize(0, widthMeasureSpec)
val height = View.getDefaultSize(0, heightMeasureSpec)
setMeasuredDimension(width, height)
}
}
代碼參考:LayoutManagerGroup
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
本文題目:RecyclerView實(shí)現(xiàn)抖音縱向滾動ViewPager效果
轉(zhuǎn)載來源:http://www.chinadenli.net/article40/iiieeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、企業(yè)網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、云服務(wù)器、響應(yīng)式網(wǎng)站、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)