我正在寻找一种使用 RecyclerView
在我的项目之间添加空格的方法和 PagerSnapHelper
.
正如您在上面看到的,两张图片之间有一点黑色空间。但这些空间仅在滚动时可用。如果scrollState在SCROLL_STATE_IDLE
图像居中对齐并且是“全宽”。
这就是我想要实现的。
我的想法是向我的 RecyclerView.Adapter
添加一个新“占位符”viewType
并自定义 PagerSnapHelper
“跳过”占位符 viewType
(也可以跳过每一秒的 View
)。
但不知何故,这是行不通的。我无法更改 PagerSnaperHelper
(或包含 PagerSnapHelper
中大量重复代码的 SnapHelper
)按我想要的方式工作。更进一步,在实现它时感觉有点不对劲。感觉就像“这不是应该的方式”。
那么 - 有什么建议或想法可以解决这个问题吗? 我对所有建议都持开放态度。
免责声明:
我知道我可以使用旧的 ViewPager
为了这。但出于特殊原因,我要求实现 RecyclerView
😉。所以请不要在这里建议使用ViewPager
,谢谢😃。
最佳答案
你可以试试这个:
创建两个 viewType
,第一个是你的图像,第二个是黑色缩进。然后在 SCROLL_STATE_IDLE
和 SCROLL_STATE_SETTLING
调用 smoothScrollToPosition(position)
到所需位置。
val pagerSnapHelper = PagerSnapHelper()
val spacePagerSnapHelper = SpacePagerSnapHelper(pagerSnapHelper)
pagerSnapHelper.attachToRecyclerView(recyclerView)
spacePagerSnapHelper.attachToRecyclerView(recyclerView)
这是SpacePagerSnapHelper
:
/**
* This is an [RecyclerView.OnScrollListener] which will scrolls
* the [RecyclerView] to the next closes position if the
* position of the snapped View (calculated by the given [snapHelper] in [SnapHelper.findSnapView])
* is odd. Because each odd position is a space/placeholder where we want to jump over.
*
* See also [this SO question](https://stackoverflow.com/q/51747104).
*/
class SpacePagerSnapHelper(
private val snapHelper: SnapHelper
) : RecyclerView.OnScrollListener() {
private enum class ScrollDirection {
UNKNOWN, LEFT, RIGHT
}
private var scrollDirection: ScrollDirection = UNKNOWN
fun attachToRecyclerView(recyclerView: RecyclerView) {
recyclerView.addOnScrollListener(this)
}
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
scrollDirection = if (dx > 0) RIGHT else LEFT
}
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
when (newState) {
RecyclerView.SCROLL_STATE_IDLE -> onPageChanged(recyclerView)
RecyclerView.SCROLL_STATE_SETTLING -> onPageChanged(recyclerView)
}
}
private fun onPageChanged(recyclerView: RecyclerView) {
val layoutManager = recyclerView.layoutManager
val viewToSnap = snapHelper.findSnapView(layoutManager)
viewToSnap?.let {
val position = layoutManager.getPosition(it)
// Only "jump over" each second item because it is a space/placeholder
// see also MediaContentAdapter.
if (position % 2 != 0) {
when (scrollDirection) {
LEFT -> {
recyclerView.smoothScrollToPosition(position - 1)
}
RIGHT -> {
recyclerView.smoothScrollToPosition(position + 1)
}
UNKNOWN -> {
Timber.i("Unknown scrollDirection... Don't know where to go")
}
}
}
}
}
}
关于android - 使用 PagerSnapHelper 在 RecyclerView 中添加空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51747104/