Convert Figma logo to code with AI

rubensousa logoGravitySnapHelper

A SnapHelper that snaps a RecyclerView to an edge.

4,997
614
4,997
6

Top Related Projects

ImageView and FrameLayout with gestures control and position animation

8,494

Epoxy is an Android library for building complex screens in a RecyclerView

7,679

A declarative framework for building efficient UIs on Android.

Flexbox for Android

Flexible multiple types for Android RecyclerView.

An Android Animation library which easily add itemanimator to RecyclerView items.

Quick Overview

The GravitySnapHelper is a custom SnapHelper implementation for Android's RecyclerView that provides a gravity-based snapping behavior. It allows users to easily snap items in a RecyclerView to the center or to the nearest item when scrolling.

Pros

  • Customizable Snapping Behavior: The library provides various options to customize the snapping behavior, such as setting the snap gravity (start, end, center) and the snap distance.
  • Smooth Scrolling: The snapping animation is smooth and seamless, providing a pleasant user experience.
  • Easy Integration: The library is easy to integrate into an existing Android project and requires minimal setup.
  • Actively Maintained: The project is actively maintained, with regular updates and bug fixes.

Cons

  • Limited Flexibility: The library may not provide as much flexibility as a custom-built snapping implementation, as it has a specific set of features and configurations.
  • Dependency on RecyclerView: The library is tightly coupled with the RecyclerView component, which means it may not be suitable for use with other types of views.
  • Potential Performance Impact: Depending on the complexity of the RecyclerView and the number of items, the snapping behavior may have a slight performance impact.
  • Lack of Documentation: The project's documentation could be more comprehensive, making it harder for new users to get started.

Code Examples

To use the GravitySnapHelper, you can simply create an instance of the GravitySnapHelper class and attach it to your RecyclerView:

val snapHelper = GravitySnapHelper(Gravity.CENTER)
snapHelper.attachToRecyclerView(recyclerView)

You can also customize the snapping behavior by setting the snap gravity and the snap distance:

val snapHelper = GravitySnapHelper(Gravity.START, 100f)
snapHelper.attachToRecyclerView(recyclerView)

If you need to detach the GravitySnapHelper from the RecyclerView, you can use the following code:

snapHelper.attachToRecyclerView(null)

Getting Started

To use the GravitySnapHelper in your Android project, follow these steps:

  1. Add the library to your project's build.gradle file:
dependencies {
    implementation 'com.github.rubensousa:gravitysnaphelper:2.2.1'
}
  1. Create an instance of the GravitySnapHelper and attach it to your RecyclerView:
val snapHelper = GravitySnapHelper(Gravity.CENTER)
snapHelper.attachToRecyclerView(recyclerView)
  1. (Optional) Customize the snapping behavior by setting the snap gravity and the snap distance:
val snapHelper = GravitySnapHelper(Gravity.START, 100f)
snapHelper.attachToRecyclerView(recyclerView)
  1. (Optional) Detach the GravitySnapHelper from the RecyclerView when it's no longer needed:
snapHelper.attachToRecyclerView(null)

That's it! You've successfully integrated the GravitySnapHelper into your Android project.

Competitor Comparisons

ImageView and FrameLayout with gestures control and position animation

Pros of GestureViews

  • Offers a wider range of gesture controls, including pinch-to-zoom and double-tap-to-zoom
  • Provides smooth transitions and animations for image viewing
  • Supports both single image and gallery views

Cons of GestureViews

  • More complex implementation compared to the simpler GravitySnapHelper
  • May have a steeper learning curve for developers new to gesture handling
  • Potentially higher resource usage due to advanced features

Code Comparison

GestureViews:

GestureImageView imageView = findViewById(R.id.image);
imageView.getController()
    .setMaxZoom(3f)
    .setDoubleTapZoom(2f)
    .setOverscrollDistance(0f, 0f)
    .setOverzoomFactor(2f);

GravitySnapHelper:

RecyclerView recyclerView = findViewById(R.id.recycler_view);
SnapHelper snapHelper = new GravitySnapHelper(Gravity.START);
snapHelper.attachToRecyclerView(recyclerView);

GestureViews offers more comprehensive image manipulation features, while GravitySnapHelper focuses on snapping items in a RecyclerView. GestureViews requires more configuration but provides advanced functionality for image viewing. GravitySnapHelper is simpler to implement and is specifically designed for RecyclerView item snapping.

8,494

Epoxy is an Android library for building complex screens in a RecyclerView

Pros of Epoxy

  • More comprehensive solution for building complex RecyclerView layouts
  • Supports data binding and view binding out of the box
  • Offers automatic diffing and efficient updates for better performance

Cons of Epoxy

  • Steeper learning curve due to its more complex architecture
  • Requires more setup and boilerplate code for simple use cases
  • Larger library size, which may impact app size

Code Comparison

GravitySnapHelper:

val snapHelper = GravitySnapHelper(Gravity.START)
snapHelper.attachToRecyclerView(recyclerView)

Epoxy:

class MyEpoxyController : EpoxyController() {
    override fun buildModels() {
        // Build your models here
    }
}
val controller = MyEpoxyController()
recyclerView.setController(controller)

Summary

GravitySnapHelper is a lightweight solution focused on snapping items in a RecyclerView, while Epoxy is a more comprehensive library for building complex RecyclerView layouts. GravitySnapHelper is easier to implement for simple use cases, but Epoxy offers more powerful features for managing complex lists and layouts. The choice between the two depends on the specific requirements of your project and the level of complexity you need to handle in your RecyclerView implementations.

7,679

A declarative framework for building efficient UIs on Android.

Pros of Litho

  • More comprehensive UI framework for building efficient UIs at scale
  • Declarative API for easier component composition and state management
  • Asynchronous layout calculation and rendering for improved performance

Cons of Litho

  • Steeper learning curve due to its unique architecture and concepts
  • Requires more setup and integration compared to GravitySnapHelper
  • Less suitable for small-scale projects or simple UI components

Code Comparison

GravitySnapHelper:

GravitySnapHelper snapHelper = new GravitySnapHelper(Gravity.START);
snapHelper.attachToRecyclerView(recyclerView);

Litho:

@LayoutSpec
class MyComponentSpec {
  @OnCreateLayout
  static Component onCreateLayout(ComponentContext c) {
    return Text.create(c).text("Hello, Litho!").build();
  }
}

GravitySnapHelper focuses on enhancing RecyclerView scrolling behavior, while Litho provides a complete UI framework. GravitySnapHelper is easier to implement for specific scrolling needs, whereas Litho offers more powerful tools for building complex UIs but requires a deeper understanding of its architecture.

Flexbox for Android

Pros of flexbox-layout

  • Provides a more comprehensive layout system with flexible box capabilities
  • Offers better support for responsive designs and complex layouts
  • Integrates well with existing Android views and layouts

Cons of flexbox-layout

  • Steeper learning curve due to more complex API and concepts
  • May introduce unnecessary complexity for simpler layout requirements
  • Potentially higher performance overhead for basic layouts

Code Comparison

GravitySnapHelper:

RecyclerView recyclerView = findViewById(R.id.recyclerView);
SnapHelper snapHelper = new GravitySnapHelper(Gravity.START);
snapHelper.attachToRecyclerView(recyclerView);

flexbox-layout:

FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(context);
layoutManager.setFlexDirection(FlexDirection.ROW);
layoutManager.setJustifyContent(JustifyContent.FLEX_START);
recyclerView.setLayoutManager(layoutManager);

Summary

GravitySnapHelper is a lightweight solution focused on snapping RecyclerView items to specific positions, while flexbox-layout provides a more comprehensive layout system based on CSS Flexbox. GravitySnapHelper is simpler to implement and use for basic snapping behavior, whereas flexbox-layout offers greater flexibility for complex layouts but requires more setup and understanding of flexbox concepts.

Flexible multiple types for Android RecyclerView.

Pros of MultiType

  • More versatile, supporting multiple view types in RecyclerView
  • Simplifies handling of complex list structures
  • Provides a cleaner, more organized approach to adapter creation

Cons of MultiType

  • Steeper learning curve for beginners
  • May be overkill for simple, single-view-type lists
  • Requires more initial setup compared to GravitySnapHelper

Code Comparison

MultiType:

class TextItemViewBinder : ItemViewBinder<TextItem, TextItemViewBinder.ViewHolder>() {
    override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup): ViewHolder {
        return ViewHolder(inflater.inflate(R.layout.item_text, parent, false))
    }
    override fun onBindViewHolder(holder: ViewHolder, item: TextItem) {
        holder.textView.text = item.text
    }
}

GravitySnapHelper:

val layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
recyclerView.layoutManager = layoutManager
val snapHelper = GravitySnapHelper(Gravity.CENTER)
snapHelper.attachToRecyclerView(recyclerView)

MultiType focuses on organizing and binding different view types, while GravitySnapHelper is specifically designed for snapping items in RecyclerView to certain positions. MultiType offers more flexibility for complex lists, but GravitySnapHelper provides an easy solution for creating snap-to-position effects in scrollable lists.

An Android Animation library which easily add itemanimator to RecyclerView items.

Pros of recyclerview-animators

  • Offers a wide variety of pre-built animations for RecyclerView items
  • Supports custom animations for adding, removing, and moving items
  • Easy to implement with minimal code changes

Cons of recyclerview-animators

  • May impact performance with complex animations on large datasets
  • Limited control over snapping behavior compared to GravitySnapHelper
  • Requires additional setup for combining animations with snapping functionality

Code Comparison

GravitySnapHelper:

val snapHelper = GravitySnapHelper(Gravity.START)
snapHelper.attachToRecyclerView(recyclerView)

recyclerview-animators:

val animator = SlideInLeftAnimator()
recyclerView.itemAnimator = animator

Summary

recyclerview-animators excels in providing a rich set of animations for RecyclerView items, offering developers an easy way to enhance the visual appeal of their lists. However, it lacks the specialized snapping functionality provided by GravitySnapHelper. GravitySnapHelper focuses on improving the scrolling and positioning behavior of RecyclerView items, which can be particularly useful for horizontal lists or grid layouts. While both libraries serve different primary purposes, they can be used together to create a more engaging and polished RecyclerView experience.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

GravitySnapHelper

A SnapHelper that snaps a RecyclerView to an edge.

Setup

Add this to your build.gradle:

implementation 'com.github.rubensousa:gravitysnaphelper:2.2.2'

How to use

You can either create a GravitySnapHelper, or use GravitySnapRecyclerView.

If you want to use GravitySnapHelper directly, you just need to create it and attach it to your RecyclerView:

val snapHelper = GravitySnapHelper(Gravity.START)
snapHelper.attachToRecyclerView(recyclerView)

If you want to use GravitySnapRecyclerView, you can use the following xml attributes for customisation:

<attr name="snapGravity" format="enum">
<attr name="snapEnabled" format="boolean" />
<attr name="snapLastItem" format="boolean" />
<attr name="snapToPadding" format="boolean" />
<attr name="snapScrollMsPerInch" format="float" />
<attr name="snapMaxFlingSizeFraction" format="float" />

Example:

<com.github.rubensousa.gravitysnaphelper.GravitySnapRecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:snapGravity="start" />

Start snapping

val snapHelper = GravitySnapHelper(Gravity.START)
snapHelper.attachToRecyclerView(recyclerView)

Center snapping

val snapHelper = GravitySnapHelper(Gravity.CENTER)
snapHelper.attachToRecyclerView(recyclerView)

Limiting fling distance

If you use setMaxFlingSizeFraction or setMaxFlingDistance you can change the maximum fling distance allowed.

With decoration

Features

  1. setMaxFlingDistance or setMaxFlingSizeFraction - changes the max fling distance allowed.
  2. setScrollMsPerInch - changes the scroll speed.
  3. setGravity - changes the gravity of the SnapHelper.
  4. setSnapToPadding - enables snapping to padding (default is false)
  5. smoothScrollToPosition and scrollToPosition
  6. RTL support out of the box

Nested RecyclerViews

Take a look at these blog posts if you're using nested RecyclerViews

  1. Improving scrolling behavior of nested RecyclerViews

  2. Saving scroll state of nested RecyclerViews

License

Copyright 2018 The Android Open Source Project
Copyright 2019 Rúben Sousa

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.