国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

RecyclerView實現抖音縱向滾動ViewPager效果

2019-12-12 00:42:38
字體:
來源:轉載
供稿:網友

使用RecyclerView實現抖音縱向滾動ViewPager效果,供大家參考,具體內容如下

重寫LinearLayoutManager,在onAttachedToWindow方法中使用 PagerSnapHelper設置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)//設置RecyclerView每次滾動一頁    mRecyclerView = view    mRecyclerView.addOnChildAttachStateChangeListener(mChildAttachStateChangeListener)  }  /**   * 滑動狀態的改變   * 緩慢拖拽-> SCROLL_STATE_DRAGGING   * 快速滾動-> SCROLL_STATE_SETTLING   * 空閑狀態-> 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)      }    }  }  /**   * 布局完成后調用   * @param state   */  override fun onLayoutCompleted(state: RecyclerView.State?) {    super.onLayoutCompleted(state)    if (mOnViewPagerListener != null) mOnViewPagerListener!!.onLayoutComplete()  }  /**   * 監聽豎直方向的相對偏移量   */  override fun scrollVerticallyBy(dy: Int, recycler: RecyclerView.Recycler?, state: RecyclerView.State?): Int {    this.mDrift = dy    return super.scrollVerticallyBy(dy, recycler, state)  }  /**   * 監聽水平方向的相對偏移量   */  override fun scrollHorizontallyBy(dx: Int, recycler: RecyclerView.Recycler?, state: RecyclerView.State?): Int {    this.mDrift = dx    return super.scrollHorizontallyBy(dx, recycler, state)  }  /**   * 設置監聽   * @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{    /*釋放的監聽*/    fun onPageRelease(isNext: Boolean, position: Int)    /*選中的監聽以及判斷是否滑動到底部*/    fun onPageSelected(position: Int, isBottom: Boolean)    /*布局完成的監聽*/    fun onLayoutComplete()  }}

重寫RecyclerView條目內容主布局滿屏填充

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汤原县| 上林县| 时尚| 大连市| 辰溪县| 丰镇市| 玛多县| 仙游县| 澳门| 江达县| 邮箱| 临高县| 永川市| 游戏| 花莲市| 灯塔市| 曲周县| 海晏县| 神农架林区| 利津县| 苏尼特左旗| 鲁山县| 汾西县| 孟连| 南和县| 西昌市| 海淀区| 大宁县| 顺平县| 黎川县| 泸溪县| 汕头市| 永新县| 涡阳县| 虞城县| 余姚市| 山丹县| 北宁市| 张家口市| 瑞昌市| 额济纳旗|