垂直方向的 Recyclerview 在屏幕水平滚动时上下滚动

muk*_*esh 2 android kotlin android-recyclerview pagersnaphelper

我需要创建一个包含全屏视频的列表。我使用 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)
}
}
Run Code Online (Sandbox Code Playgroud)
  1. RecyclerView适配器
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)
}
}
Run Code Online (Sandbox Code Playgroud)

3. 添加滚动监听器

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

Jen*_*anu 5

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

在您的情况下,覆盖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)
}
Run Code Online (Sandbox Code Playgroud)