Skip to content

Instantly share code, notes, and snippets.

@bolot
Last active August 30, 2023 07:19
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save bolot/6f1838d29d5b8a87b5fcadbeb53fb6f0 to your computer and use it in GitHub Desktop.
Save bolot/6f1838d29d5b8a87b5fcadbeb53fb6f0 to your computer and use it in GitHub Desktop.
LinearLayoutManager subclass that "peeks", shows a portion of the adjacent child views.
class PeekingLinearLayoutManager : LinearLayoutManager {
@Suppress("Unused")
@JvmOverloads
constructor(context: Context?, @RecyclerView.Orientation orientation: Int = RecyclerView.VERTICAL, reverseLayout: Boolean = false) : super(context, orientation, reverseLayout)
@Suppress("Unused")
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
override fun generateDefaultLayoutParams() =
scaledLayoutParams(super.generateDefaultLayoutParams())
override fun generateLayoutParams(lp: ViewGroup.LayoutParams?) =
scaledLayoutParams(super.generateLayoutParams(lp))
override fun generateLayoutParams(c: Context?, attrs: AttributeSet?) =
scaledLayoutParams(super.generateLayoutParams(c, attrs))
private fun scaledLayoutParams(layoutParams: RecyclerView.LayoutParams) =
layoutParams.apply {
when(orientation) {
HORIZONTAL -> width = (horizontalSpace * ratio).toInt()
VERTICAL -> height = (verticalSpace * ratio).toInt()
}
}
private val horizontalSpace get() = width - paddingStart - paddingEnd
private val verticalSpace get() = height - paddingTop - paddingBottom
private val ratio = 0.9f
}
@bolot
Copy link
Author

bolot commented Oct 8, 2018

@tinsukE
Copy link

tinsukE commented Aug 27, 2019

You should use height for the verticalSpace calculation. Tnx for the code!

@bolot
Copy link
Author

bolot commented Aug 28, 2019

Good catch!

@andrecardoso
Copy link

You might want to add the following change to avoid showing an empty space when there is a single item:

 private fun scaledLayoutParams(layoutParams: RecyclerView.LayoutParams): RecyclerView.LayoutParams {
        if (itemCount == 1) {
            return layoutParams
        }

        return layoutParams.apply {
            when (orientation) {
                HORIZONTAL -> width = (horizontalSpace * ratio).toInt()
                VERTICAL -> height = (verticalSpace * ratio).toInt()
            }
        }
    }

@maheshpx
Copy link

It is not working when we have item height more than item width
Screenshot_1635407809

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment