muk*_*esh 2 android kotlin android-recyclerview pagersnaphelper
我需要创建一个包含全屏视频的列表。我使用 PagerSnapHelper 作为全屏子项目。我有一个 Exoplayer 实例并在滚动时更改视频。视频也会在水平滚动时发生变化。
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)
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)
要禁用滚动,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)
| 归档时间: |
|
| 查看次数: |
725 次 |
| 最近记录: |