GravitySnapHelper icon indicating copy to clipboard operation
GravitySnapHelper copied to clipboard

Does this can work like PagerSnapHelper

Open sopharasum opened this issue 4 years ago • 7 comments

sopharasum avatar Dec 07 '20 02:12 sopharasum

kotlin code works like pager snap helper

val snapHelper : GravitySnapHelper = object : GravitySnapHelper(Gravity.TOP){
            override fun findTargetSnapPosition(
                layoutManager: RecyclerView.LayoutManager,
                velocityX: Int,
                velocityY: Int
            ): Int {
                val centerView = findSnapView(layoutManager) ?: return RecyclerView.NO_POSITION
                val position = layoutManager.getPosition(centerView)
                var targetPosition = -1
                if (layoutManager.canScrollHorizontally()) {
                    targetPosition = if (velocityX < 0) {
                        position - 1
                    } else {
                        position + 1
                    }
                }
                if (layoutManager.canScrollVertically()) {
                    targetPosition = if (velocityY < 0) {
                        position - 1
                    } else {
                        position + 1
                    }
                }
                val firstItem = 0
                val lastItem = layoutManager.itemCount - 1
                targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem))
                return targetPosition
            }
        }

snapHelper .attachToRecyclerView(binding?.yourRecyclerView)

RohanArora13 avatar Jan 26 '21 13:01 RohanArora13

kotlin code works like pager snap helper

val snapHelper : GravitySnapHelper = object : GravitySnapHelper(Gravity.TOP){
            override fun findTargetSnapPosition(
                layoutManager: RecyclerView.LayoutManager,
                velocityX: Int,
                velocityY: Int
            ): Int {
                val centerView = findSnapView(layoutManager) ?: return RecyclerView.NO_POSITION
                val position = layoutManager.getPosition(centerView)
                var targetPosition = -1
                if (layoutManager.canScrollHorizontally()) {
                    targetPosition = if (velocityX < 0) {
                        position - 1
                    } else {
                        position + 1
                    }
                }
                if (layoutManager.canScrollVertically()) {
                    targetPosition = if (velocityY < 0) {
                        position - 1
                    } else {
                        position + 1
                    }
                }
                val firstItem = 0
                val lastItem = layoutManager.itemCount - 1
                targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem))
                return targetPosition
            }
        }

snapHelper .attachToRecyclerView(binding?.yourRecyclerView)

Thank you brother for your snip of code. However, it does not work like a PagerSnapHelper when we swipe right or left.

sopharasum avatar Feb 08 '21 01:02 sopharasum

Did you check this? https://github.com/rubensousa/GravitySnapHelper/blob/master/gravitysnaphelper/src/main/java/com/github/rubensousa/gravitysnaphelper/GravityPagerSnapHelper.java

rubensousa avatar Feb 09 '21 20:02 rubensousa

Did you check this? https://github.com/rubensousa/GravitySnapHelper/blob/master/gravitysnaphelper/src/main/java/com/github/rubensousa/gravitysnaphelper/GravityPagerSnapHelper.java

How do you implement this function? As I am trying to attach it to RecyclerView. Even though I am trying to replace GravitySnapHelper with GravityPagerSnapHelper on your custom object, still it does not work fine. If I have 3 items in HorizontalRecyclerView, when I swipe right, it will jump to the last position.

sopharasum avatar Feb 10 '21 01:02 sopharasum

Can you upload a sample showcasing the issue? GravityPagerSnapHelper only works if you have the items with "match_parent", same as ViewPager

rubensousa avatar Feb 10 '21 23:02 rubensousa

like this? binding.snapHelper = GravitySnapHelper(Gravity.START).apply { maxFlingDistance = Your Screen Width }

giagor avatar Nov 19 '21 07:11 giagor

@rubensousa Is it possible to work with items width are smaller than screen width?

charlie-yang-gogox avatar Feb 01 '24 06:02 charlie-yang-gogox