android - 使用 PagerSnapHelper 在 RecyclerView 中添加空间

标签 android android-layout android-recyclerview pagersnaphelper

我正在寻找一种使用 RecyclerView 在我的项目之间添加空格的方法和 PagerSnapHelper .

为了证明我在这里的意思是一个 gif:

正如您在上面看到的,两张图片之间有一点黑色空间。但这些空间仅在滚动时可用。如果scrollStateSCROLL_STATE_IDLE图像居中对齐并且是“全宽”。

这就是我想要实现的。

我的想法是向我的 RecyclerView.Adapter 添加一个新“占位符”viewType 并自定义 PagerSnapHelper “跳过”占位符 viewType(也可以跳过每一秒的 View)。 但不知何故,这是行不通的。我无法更改 PagerSnaperHelper(或包含 PagerSnapHelper 中大量重复代码的 SnapHelper)按我想要的方式工作。更进一步,在实现它时感觉有点不对劲。感觉就像“这不是应该的方式”。

那么 - 有什么建议或想法可以解决这个问题吗? 我对所有建议都持开放态度。

免责声明:
我知道我可以使用旧的 ViewPager为了这。但出于特殊原因,我要求实现 RecyclerView 😉。所以请不要在这里建议使用ViewPager,谢谢😃。

最佳答案

你可以试试这个: 创建两个 viewType,第一个是你的图像,第二个是黑色缩进。然后在 SCROLL_STATE_IDLESCROLL_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/

相关文章:

android - 如何在 Android Studio 中指定 View 相对于其宽度的高度?

java - 防止 Recyclerview 在键盘可见时调整大小

带有 RecylcerView 的 Android Viewpager2,在应用 PageTransformer 时启用项目动画器

android - stub_image 显示在 recyclerview 中的通用图像加载器上

java - Android完全隐藏RelativeLayout

android - React Native App 在 "--variant=release"命令 : Signed APK 上崩溃

java - Android 布局中的绝对居中

android - 无法为调试器绑定(bind)到本地 86XX

android - 嵌套 ScrollView 中的 Recyclerview

android - 单击 ListView 的 subview 时从 ListView 获取数据