Custom ViewPager that allows to block left or right swipe gestures.

Overview

Donation About Jan Rabe

SwipeDirectionViewPager Javadoc Build Status API Gradle Version Kotlin Licence androidx

Introduction

Custom ViewPager that allows to block swiping right or left where the ViewPager child fragments set the scroll direction and handle blocked swipe events. The library also comes with an adapter that can handle different view pages views and can control the view pager scrolling from within view pager pages.

Screenshot Screenshot

How to install

repositories {
    maven {
        url "https://jitpack.io"
    }
}

dependencies {
    implementation 'com.github.kibotu:SwipeDirectionViewPager:-SNAPSHOT'
}

How to use

Basic Setup

1 Create adapter

// use Fragment#childFragmentManager in nested fragments
var adapter: ViewPagerPresenterAdapter<PageModel, ViewPagerModel> = ViewPagerPresenterAdapter(supportFragmentManager)

2 add to view pager

viewPager.adapter = adapter

3 add listeners

adapter.swipeLeftEdgeListener = Runnable {
    snackbar(this, "has swiped left on first page")
}

adapter.swipeRightEdgeListener = Runnable {
    snackbar(this, "has swiped right on last page")
}

4 add view pager fragments

(0 until 5).forEach {
    adapter.append(PageModel(text = "Page $it")) { TextPage() }
    adapter.append(PageModel(imageUrl = createRandomImageUrl())) { ImagePage() }
}

// don't forget to notify updates
adapter.notifyDataSetChanged()

5 implement ViewPagerPresenterAdapter.ViewPagerPresenter<PageModel, ViewPagerModel> interface in your view pager fragments, e.g.:

class Page : Fragment(), ViewPagerPresenterAdapter.ViewPagerPresenter<PageModel, ViewPagerModel> {

    /**
     * into pages injected adapter
     */
    override var viewPagerPresenterAdapter: ViewPagerPresenterAdapter<PageModel, ViewPagerModel>? = null

    /**
     * gets called when allowSwipeDirection is set and user scrolls to the previous or next page.
     * basically, you set 'only swipe left' and when user swipes right, you can give the user feedback
     */
    override fun onSwipeIntercepted(direction: SwipeDirection){
    }

    /**
     * set page specific swipe allowed direction
     */
    override fun allowSwipeDirection(): SwipeDirection {
        return SwipeDirection.ALL
    }
}

Inserting fragments

Adding a new page to the end

adapter.append(PageModel(text = "Page $it")) { TextPage() }

Adding a new page to the beginning

adapter.prepend(PageModel(text = "Page $it")) { TextPage() }

Getting fragments

var fragment = viewPagerPresenterAdapter?.getFragment(adapterPosition); // don't use #getItemPosition, it interferes with fragment updates

Getting models

using adapter position

var model = viewPagerPresenterAdapter?.model(adapterPosition);

using a fragment

var model = viewPagerPresenterAdapter?.model(fragment);

Getting adapter position

Note: neither models nor fragments are unique, it's returning simply the first one found

using a fragment

var position = viewPagerPresenterAdapter?.indexOf(fragment);

using a model

var position = viewPagerPresenterAdapter?.indexOf(model);

Update fragments

ViewPager fragments need to inherit form [Updatable]. the #update(t: T) gets called in order to update fragments without the need to recreate them. (which would be the case using #notifyDataSetChanged)

replace model at given position

viewPagerPresenterAdapter?.update(PageModel(text = "updated model at position 0"), 0)

replacing a model at given criteria

viewPagerPresenterAdapter?.update(PageModel(text = "update replaced model by filter"), { it.text == "Page 2" })

modifying model data in place

viewPagerPresenterAdapter?.updateInPlace(filter = { it.text == "Page 3" }, modify = { it.text = "updated model in place by filter" })

Misc

PageModel - can be any data model, which can be bound to view pager page and can be accessed inside pages.

var model : PageModel = viewPagerPresenterAdapter?.model(fragment)

// or

var model : PageModel = viewPagerPresenterAdapter?.model(adapterPosition)

ViewPagerModel - meant to be a shared object between all pages and its parent view pager holder

var viewPagerModel : ViewPagerModel = viewPagerPresenterAdapter?.viewPagerModel

ScrollHandler

Allows view pager pages to control view pager scrolls.

viewPagerPresenterAdapter.scrollHandler

/**
 * Skips a given amount of pages.
 */
fun skip(amount: Int, smooth: Boolean = true)

/**
 * Scrolls to a given position.
 */
fun scrollTo(position: Int, smooth: Boolean = true)

/**
 * Scrolls to next page.
 */
fun scrollToNextPage()

/**
 * Scrolls to previous page.
 */
fun scrollToPreviousPage()

/**
 * @return true if current page is first.
 */
fun isFirstPage(): Boolean

/**
 * @return true if current page is last.
 */
fun isLastPage(): Boolean

RTL Support by using

net.kibotu.swipedirectionviewpager.SwipeDirectionViewPagerRtl, which uses duolingo's RtlViewPager

implementation "com.android.support:support-core-ui:$support_version"
implementation 'com.duolingo.open:rtl-viewpager:1.0.3'

How to build

graldew clean build

CI

gradlew clean assembleRelease test javadoc

Build Requirements

  • JDK8
  • Android Build Tools 27.0.2
  • Android SDK 27

Contributors

License

Copyright 2018 Jan Rabe

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.
You might also like...
Open as default - A flutter plugin that allows setting up your flutter app to open files as default
Open as default - A flutter plugin that allows setting up your flutter app to open files as default

open_as_default A flutter plugin that allows setting up your flutter app to open

The KPy gradle plugin allows you to write Kotlin/Native code and use it from python.

The KPy gradle plugin allows you to write Kotlin/Native code and use it from python.

Healtify is a native android app which allows the user to track the amout of Calories they are consuming
Healtify is a native android app which allows the user to track the amout of Calories they are consuming

Healtify is a native android app which allows the user to track the amout of Calories they are consuming. It not only tracks the calories but also shows how much of fat, protein and carbs they have consumed and how much they should be doing.

Plugin for Minecraft Dev projects that allows use BON2 as analog of fg.reobf from ForgeGradle

Bon2Gradle Plugin for Minecraft Dev projects that allows use BON2 as analog of fg.reobf from ForgeGradle. Usage Dependencies Gradle 6.8+ (Provider as

Embeddable custom voice assistant for Android applications
Embeddable custom voice assistant for Android applications

Aimybox voice assistant Open source voice assistant built on top of Aimybox SDK iOS version is available here Key Features Provides ready to use UI co

Carousel Recyclerview let's you create carousel layout with the power of recyclerview by creating custom layout manager.
Carousel Recyclerview let's you create carousel layout with the power of recyclerview by creating custom layout manager.

Carousel Recyclerview Create carousel effect in recyclerview with the CarouselRecyclerview in a simple way. Including in your project Gradle Add below

Some fancy custom views for kotlin
Some fancy custom views for kotlin

CoolCustomViews 1. Neruromorphic ProgressBar Resources Documentaion and Other So

This is a Kotlin multiplatform template project used to generate and deploy a natively compiled AWS lambda function using the custom runtime.
This is a Kotlin multiplatform template project used to generate and deploy a natively compiled AWS lambda function using the custom runtime.

Overview This is a Kotlin multiplatform template project used to generate and deploy a natively compiled AWS Lambda function using a custom runtime. U

This sample Kotlin app shows a list of custom shoes added by the users

Shoe-store This sample Kotlin app shows a list of custom shoes added by the users. The app displays the content with RecyclerView and uses a tradition

Owner
Jan Rabe
Native Android / Unity Developer & Technocrat #kotlin #csharp #unity #opensource
Jan Rabe
:bouquet: An easy way to persist and run code block only as many times as necessary on Android.

Only ?? An easy way to persist and run code block only as many times as necessary on Android. Download Gradle Add below codes to your root build.gradl

Jaewoong Eum 468 Apr 14, 2021
WaxedNotWaxed - Adds a simple indicator to know if a copper block is waxed or not

Waxed Not Waxed Adds a simple indicator to know if a copper block is waxed or no

Mateusz 2 Nov 11, 2022
Movie app that receives popular movies and allows the user to search for the specific movie through the Rest API with help of retrofit library &MVVM architecture.

MovieClue Millions of movies, TV shows and people to discover. Explore now Movie app that recieves popular movies and allow the user to search for spe

Shubham Tomar 6 Mar 31, 2022
A Kotlin compiler plugin that allows Java callers to pass in null for default parameters

kotlin-null-defaults (Compiler plugin) (Gradle Plugin) ( Currently pending approval) A Kotlin compiler plugin that allows Java callers to pass in null

Youssef Shoaib 7 Oct 14, 2022
Arrow Endpoint offers a composable Endpoint datatype, that allows us easily define an Endpoint from which we can derive clients, servers & documentation.

Arrow Endpoint Arrow Endpoint offers a composable Endpoint datatype, that allows us easily define an Endpoint from which we can derive clients, server

ΛRROW 23 Dec 15, 2022
Arrow Endpoint offers a composable Endpoint datatype, that allows us easily define an Endpoint from which we can derive clients, servers & documentation.

Arrow Endpoint Arrow Endpoint offers a composable Endpoint datatype, that allows us easily define an Endpoint from which we can derive clients, server

ΛRROW 8 Oct 11, 2021
Extension functions over Android's callback-based APIs which allows writing them in a sequential way within coroutines or observe multiple callbacks through kotlin flow.

callback-ktx A lightweight Android library that wraps Android's callback-based APIs into suspending extension functions which allow writing them in a

Sagar Viradiya 171 Oct 31, 2022
A Kotlin Multiplatform and Compose template that allows you to easily set up your project targeting: Android, Desktop, and Web

A Kotlin Multiplatform and Compose template that allows you to easily set up your project targeting: Android, Desktop, and Web

Carlos Mota 3 Oct 27, 2021
Name of your app is an android app that allows building a todo list

Project 1 - SimpleToDo Name of your app is an android app that allows building a todo list and basic todo items management functionality including add

Javier Nazario 0 Nov 23, 2021
A simple e-market application that allows users to view the store details and products, add products to the basket, and place an order.

E-Market Application Features : Store details & products screen Fetch the store detail from an endpoint and display this upper part of the screen. Fet

Amit Kumar guha 2 Jun 27, 2022