【问题标题】:Recyclerview with vertical orientation scrolls up and down on horizontally scrolls of the Screen垂直方向的 Recyclerview 在屏幕的水平滚动上上下滚动
【发布时间】:2020-07-16 11:41:52
【问题描述】:

我需要创建一个包含全屏视频的列表。我将 PagerSnapHelper 用于全屏子项。我有一个 Exoplayer 实例并在滚动时更改视频。视频也会随着水平滚动而变化。

RecyclerView.OnScrollListener() 方法也在水平滚动时调用。

请建议我如何解决这些问题。

  1. RecyclerView 应该只在垂直滚动时滚动。
  2. RecyclerView.OnScrollListener() 不应调用水平滚动

1.滚动监听器

class SnapOnScrollListener(
private val snapHelper: SnapHelper,
var behavior: Behavior = Behavior.NOTIFY_ON_SCROLL,
var onSnapPositionChangeListener: OnSnapPositionChangeListener? = null
) : RecyclerView.OnScrollListener() {

enum class Behavior {
    NOTIFY_ON_SCROLL,
    NOTIFY_ON_SCROLL_STATE_IDLE
}


override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
    System.out.println("dx.. $dx  dy $dy")
    if (behavior == Behavior.NOTIFY_ON_SCROLL) {
        maybeNotifySnapPositionChange(recyclerView)
        System.out.println("dx.. $dx  dy $dy snapChange")
    }
}

override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
    System.out.println("dx......")

    if ( behavior == Behavior.NOTIFY_ON_SCROLL_STATE_IDLE
        && newState == RecyclerView.SCROLL_STATE_IDLE
    ) {
        maybeNotifySnapPositionChange(recyclerView)
        System.out.println("dx......SnapChange")

    }
}

private fun maybeNotifySnapPositionChange(recyclerView: RecyclerView) {
    val snapPosition = snapHelper.getSnapPosition(recyclerView)
    val snapPositionChanged =
        (snapPosition != RecyclerView.NO_POSITION)
    if (snapPositionChanged) {
        onSnapPositionChangeListener?.onSnapPositionChange(snapPosition)

    }
}

fun SnapHelper.getSnapPosition(recyclerView: RecyclerView): Int {
    val layoutManager = recyclerView.layoutManager ?: return RecyclerView.NO_POSITION
    val snapView = findSnapView(layoutManager) ?: return RecyclerView.NO_POSITION
    return layoutManager.getPosition(snapView)
}
}
  1. RecyclerView 适配器
private fun manageLiveShowList() {
    liveShowAdapter = LiveShowAdapter(List.productList)
    val layoutManager = LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false)
    mLiveShowRecycler?.layoutManager = layoutManager
    mLiveShowRecycler?.adapter = liveShowAdapter
    snapHelper = PagerSnapHelper()
    snapHelper.attachToRecyclerView(mLiveShowRecycler)
    manageScrollListener(snapHelper)
}

3。添加滚动监听器

   private fun manageScrollListener(snapHelper: SnapHelper) {
    val snapOnScrollListener = SnapOnScrollListener(
        snapHelper,
        SnapOnScrollListener.Behavior.NOTIFY_ON_SCROLL,
        this
    )
    mLiveShowRecycler?.addOnScrollListener(snapOnScrollListener)
}

【问题讨论】:

    标签: android kotlin android-recyclerview pagersnaphelper


    【解决方案1】:

    要禁用RecyclerView 的滚动,您可以修改布局管理器,因为它具有canScrollVerticallycanScrollHorizontally 方法。注意:回收器视图中视图持有者内部的内容可以自行滚动。那是另一个问题。

    在您的情况下,覆盖 canScrollHorizontally 以始终返回 false

    private fun manageLiveShowList() {
        liveShowAdapter = LiveShowAdapter(List.productList)
        val layoutManager = LinearLayoutManager(requireContext(), RecyclerView.VERTICAL, false) {
                override fun canScrollHorizontally(): Boolean = false
            }
        mLiveShowRecycler?.layoutManager = layoutManager
        mLiveShowRecycler?.adapter = liveShowAdapter
        snapHelper = PagerSnapHelper()
        snapHelper.attachToRecyclerView(mLiveShowRecycler)
        manageScrollListener(snapHelper)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      相关资源
      最近更新 更多