Don't write a RecyclerView adapter again. Not even a ViewHolder!

Overview

Download Android Arsenal License Gitter

LastAdapter

Don't write a RecyclerView adapter again. Not even a ViewHolder!

  • Based on Android Data Binding
  • Written in Kotlin
  • No need to write the adapter
  • No need to write the viewholders
  • No need to modify your model classes
  • No need to notify the adapter when data set changes
  • Supports multiple item view types
  • Optional Callbacks/Listeners
  • Very fast — no reflection
  • Super easy API
  • Tiny size: ~30 KB
  • Minimum Android SDK: 9

Setup

Gradle

// apply plugin: 'kotlin-kapt' // this line only for Kotlin projects

android {
    ...
    dataBinding.enabled true 
}

dependencies {
    compile 'com.github.nitrico.lastadapter:lastadapter:2.3.0'
    // kapt 'com.android.databinding:compiler:GRADLE_PLUGIN_VERSION' // this line only for Kotlin projects
}

Usage

Create your item layouts with <layout> as root:

<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable name="item" type="com.github.nitrico.lastadapterproject.item.Header"/>
    </data>
    
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{item.text}"/>
        
</layout>

It is important for all the item types to have the same variable name, in this case "item". This name is passed to the adapter builder as BR.variableName, in this case BR.item:

// Java
new LastAdapter(listOfItems, BR.item)
           .map(Header.class, R.layout.item_header)
           .map(Point.class, R.layout.item_point)
           .into(recyclerView);
// Kotlin
LastAdapter(listOfItems, BR.item)
           .map<Header>(R.layout.item_header)
           .map<Point>(R.layout.item_point)
           .into(recyclerView)

The list of items can be an ObservableList if you want to get the adapter automatically updated when its content changes, or a simple List if you don't need to use this feature.

LayoutHandler

The LayoutHandler interface allows you to use different layouts based on more complex criteria. Its one single method receives the item and the position and returns the layout resource id.

// Java sample
new LastAdapter(listOfItems, BR.item)
           .handler(handler)
           .into(recyclerView);

private LayoutHandler handler = new LayoutHandler() {
    @Override public int getItemLayout(@NotNull Object item, int position) {
        if (item instanceof Header) {
            return (position == 0) ? R.layout.item_header_first : R.layout.item_header;
        } else {
            return R.layout.item_point;
        }
    }
};
// Kotlin sample
LastAdapter(listOfItems, BR.item).layout { item, position ->
    when (item) {
        is Header -> if (position == 0) R.layout.item_header_first else R.layout.item_header
        else -> R.layout.item_point 
    }
}.into(recyclerView)

For further information, please take a look at my article at Medium.

Custom fonts

You might also want to try FontBinder to easily use custom fonts in your XML layouts.

Acknowledgments

Thanks to Yigit Boyar and George Mount for this talk.

Author

Miguel Ángel Moreno

I'm open to new job positions - Contact me!

AngelList Email Facebook Google+ Linked.in Twitter

License

Copyright 2016 Miguel Ángel Moreno

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.
Comments
  • How can one set OnChildClickListener for item

    How can one set OnChildClickListener for item

    is it possible to add image in imageview via picasso

    <ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@{viewmodel.firstImage}"
    android:id="@+id/imageView3" />
    
    opened by syedalinaqi 14
  • Allow more type specific reactions without switch statements

    Allow more type specific reactions without switch statements

    In my own use of data binding and view holders I have some more complex interactions from the view to the view holder. I have several controls within an item that have their own listeners. So I have different ViewHolder types and I actually have a variable in the layout for the holder and I can bind to or use methods on the ViewHolder to do listeners or provide additional data to the view.

    Looking at this library as a possible alternative to my complex Adapter and ViewHolder, I don't see a good way to handle these more complex interactions. It is possible using the OnBindListener, but that is a single listener for all types. You end up having to do a switch statement and probably a cast. That is a code smell and what we would like to avoid by using a library like this.

    I am trying to think what is the best way to accomplish this in a minimally invasive way. What I am envisioning is a version of the map call that also accepts a parameter of a class that extends LastAdapter.ViewHolder which has an onBind method that subclasses can override to do custom work (and FYI you should add support for unbinding as well to clean up things when a view is removed from the list).

    Just sort of thinking out loud here.

    opened by dalewking 14
  • DataBinderMapperImpl not generated

    DataBinderMapperImpl not generated

    Hi, I am getting following error when I attempt to use the library in my project.

    Library version 2.3.0 Android Studio: 3.1 Canary 8 Compile SDK 27 Gradle and KAPT version: 3.1.0-alpha08

    :app:javaPreCompileDebug UP-TO-DATE C:\pahttoproject\app\build\generated\source\kapt\debug\android\databinding\DataBinderMapperImpl.java:7: error: cannot find symbol addMapper(new com.github.nitrico.lastadapter.DataBinderMapperImpl()); ^ symbol: class DataBinderMapperImpl location: package com.github.nitrico.lastadapter 1 error :app:compileDebugJavaWithJavac FAILED

    Thank you :)

    opened by veresvit 9
  • API for LastAdapter 2.0

    API for LastAdapter 2.0

    LastAdapter 2.0 is coming soon and I'd like to hear your thoughts or suggestions about its API.

    Listeners:

    • They will be specific for each item type, instead of one for the whole adapter.
    • They probably will not provide parameters view, type and item anymore, only binding and position. item and view will be available through binding.item and binding.root.
    • I will add an onRecycle callback for the view being recycled.
    • Maybe another onCreate callback for the ViewHolder being created (for the first time). Not sure yet.
    • Should I keep the onClick and onLongClick listeners? Are you really using them? I mean, you can also set them in the layout itself or in the onBind callback.

    The API for Kotlin is going to be pretty cool, in my opinion:

    LastAdapter.with(Data.items, BR.item)
        .map<Header, ItemHeaderBinding>(R.layout.item_header) {
            onCreate { println("Created ${binding.item} at position $position") }
            onBind { println("Bound ${binding.item} at position $position") }
            onClick { context.toast("Click on ${binding.item} at position $position") }
            onLongClick { context.toast("Long click on ${binding.item} at position $position") }
            onRecycle { println("Recycled ${binding.item} at position $position") }
        }
        .map<Point, ItemPointBinding>(R.layout.item_point) /*{
            onCreate { println("Created ${binding.item} at position $position") }
            onBind { println("Bound ${binding.item} at position $position") }
            onClick { context.toast("Click on ${binding.item} at position $position") }
            onLongClick { context.toast("Long click on ${binding.item} at position $position") }
            onRecycle { println("Recycled ${binding.item} at position $position") }
        }*/
        .into(list)
    

    API for Java is not so cool, at least right now...

    LayoutHandler / TypeHandler: With the listeners being specific for each type, the "LayoutHandler" should become a "TypeHandler" and returns more than just the layout. Probably something like:

    val typeHeader = Type<ItemHeaderBinding>(R.layout.item_header)
        .onBind { println("Bound ${binding.item} at position $position") }
        .onClick { context.toast("Click on ${binding.item} at position $position") }
        .onLongClick { context.toast("Long click on ${binding.item} at position $position") }
        .onRecycle { println("Recycled ${binding.item} at position $position") }
    
    val typePoint = Type<ItemPointBinding>(R.layout.item_point)
        .onClick { context.toast("Click on ${binding.item} at position $position") }
    
    val typeHeaderFist = Type<ItemHeaderFirstBinding>(R.layout.item_header_first) 
        .onBind { println("Bound ${binding.item} at position $position") }
    
    LastAdapter.with(Data.items, BR.item) {
        when (item) {
            is Header -> if (position == 0) typeHeaderFirst else typeHeader
            is Point -> typePoint
            else -> null
        }
    }.into(list)
    

    Data Binding: I'm even considering the possibility of letting the "users" decide if they want to use Data Binding or not, and do the binding manually if they want.

    Feel free to leave your thoughts here :)

    question 
    opened by nitrico 8
  • IndexOutOfBoundExeption when notifyDataSetChanged() is called

    IndexOutOfBoundExeption when notifyDataSetChanged() is called

    Stack trace:

    07-10 15:11:53.936 E/AndroidRuntime: FATAL EXCEPTION: main
                                         Process: com.nejctomsic.registerzdravil.debug, PID: 18830
                                         java.lang.IndexOutOfBoundsException: Index: 3, Size: 1
                                             at java.util.ArrayList.get(ArrayList.java:411)
                                             at com.github.nitrico.lastadapter.LastAdapter.getType(LastAdapter.kt:178)
                                             at com.github.nitrico.lastadapter.LastAdapter.onViewRecycled(LastAdapter.kt:132)
                                             at com.github.nitrico.lastadapter.LastAdapter.onViewRecycled(LastAdapter.kt:27)
                                             at android.support.v7.widget.RecyclerView$Recycler.dispatchViewRecycled(RecyclerView.java:6064)
    

    The issue was not present until version 2.2.2. It was added in this commit. The problem is when notifyDataSetChanged() is called on the adapter, with a new backing list that has fewer elements than the old one. To fix this, the line that compares the position should be reverted to this one.

    opened by alenjularic 7
  • IllegalStateException: reference.get() must not be null

    IllegalStateException: reference.get() must not be null

    Hello.

    I use LastAdapter v1.2.0. My code is written in Java. Sometimes when I go back to activity with fragment I use LastAdapter in I get this:

    java.lang.IllegalStateException: reference.get() must not be null
        at com.github.nitrico.lastadapter.WeakReferenceOnListChangedCallback.getAdapter(WeakReferenceOnListChangedCallback.kt:30)
        at com.github.nitrico.lastadapter.WeakReferenceOnListChangedCallback.onItemRangeInserted(WeakReferenceOnListChangedCallback.kt:41)
        at android.databinding.ListChangeRegistry$1.onNotifyCallback(ListChangeRegistry.java:47)
        at android.databinding.ListChangeRegistry$1.onNotifyCallback(ListChangeRegistry.java:38)
        at android.databinding.CallbackRegistry.notifyCallbacks(CallbackRegistry.java:201)
        at android.databinding.CallbackRegistry.notifyFirst64(CallbackRegistry.java:122)
        at android.databinding.CallbackRegistry.notifyRemainder(CallbackRegistry.java:169)
        at android.databinding.CallbackRegistry.notifyRecurse(CallbackRegistry.java:145)
        at android.databinding.CallbackRegistry.notifyCallbacks(CallbackRegistry.java:91)
        at android.databinding.ListChangeRegistry.notifyCallbacks(ListChangeRegistry.java:135)
        at android.databinding.ListChangeRegistry.notifyInserted(ListChangeRegistry.java:93)
        at android.databinding.ObservableArrayList.notifyAdd(ObservableArrayList.java:118)
        at android.databinding.ObservableArrayList.addAll(ObservableArrayList.java:60)
        ...
    
    opened by LissF 6
  • Error on BR

    Error on BR

    Hi, I'm trying to use LastAdapter, and have a problem. I refered app on github, and have error "Unresolved reference: BR". Is this error occur before?

    Here's my item layout source

    <layout xmlns:android="http://schemas.android.com/apk/res/android" >
    
    <data>
        <variable name="item" type="com.example.icarusud.project.RecyclerViewItem" />
    </data>
    
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@{item.text}" />
    </layout>
    
    opened by molo0 6
  • onBindListener overload for lambdas

    onBindListener overload for lambdas

    Having to do this is ugly:

            LastAdapter.with(content, BR.item)
                    .map<ListItem>(R.layout.fragment_grid_list_item)
                    .onBindListener(object : LastAdapter.OnBindListener {
                        override fun onBind(item: Any, view: View, pos: Int) {
                            doStuff()
                        }
                    })
                    .into(contentView)
    

    I would much rather do this:

            LastAdapter.with(content, BR.item)
                    .map<ListItem>(R.layout.fragment_grid_list_item)
                    .onBindListener { item, view, pos -> doStuff() }
                    .into(contentView)
    

    Also, similar for click and long click listeners.

    I can provide the PR if you approve this feature request.

    enhancement 
    opened by sargunv 6
  • AndroidX Support

    AndroidX Support

    Just tried to update my project to AndroidX (https://developer.android.com/topic/libraries/support-library/androidx-rn) and LastAdapter took issue with the change, despite the Refactoring Tool claiming to use dependency translation to enable compatibility with Support-library-based libraries.

    opened by ptrbrynt 4
  • Mixing version can lead to runtime crashes

    Mixing version can lead to runtime crashes

    `apply plugin: 'com.android.application'

    apply plugin: 'kotlin-android'

    apply plugin: 'kotlin-android-extensions'

    apply plugin: 'kotlin-kapt'

    android { compileSdkVersion 26 buildToolsVersion "26.0.1" defaultConfig { applicationId "com.fintech.assetvantage" minSdkVersion 16 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } dataBinding{ enabled true } }

    dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', { exclude group: 'com.android.support', module: 'support-annotations' }) implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" kapt 'com.android.databinding:compiler:3.0.0-beta6' implementation 'com.github.nitrico.lastadapter:lastadapter:2.2.2' } ` My app:build.gradle file is like above. support library dependacy gives error like Mixing version can lead to runtime crashes

    opened by VijayMakwana 4
  • Changelog for version 2.3.0?

    Changelog for version 2.3.0?

    I see new version 2.3.0 but no change log there. We use LastAdapter in every project. It is important to know the changes before updating. Can you please provide the changes?

    Thanks a lot for the wonderful library!

    opened by kirtan403 3
  • Please move to mavenCentral (JCenter is closing down)

    Please move to mavenCentral (JCenter is closing down)

    Hi there,

    LastAdapter is currently only available from JCenter as a dependency. Since version 4.2 of Android studio, there is a warning: "JCenter is at end of life". Googling this revealed this article: https://wajahatkarim.com/2021/02/jcenter-bintray-shutting-down/

    So please move over to maven Central.

    Kind regards,

    Lars

    opened by lsh-silpion 1
  • Bind issues after Android Studio 3.2 release

    Bind issues after Android Studio 3.2 release

    I just migrated whole project to Android Studio 3.2.1, gradle 4.10, Kotlin 1.2.71

    I can't build project due to error with generated binding class:

    image

    Do you have any idea what might be the cause? Cleaning project does not help here. I'm using databinding compiler from androidx reference, but i doubt that this have any impact on this

    opened by jakoss 3
  • Support binding to LiveData (pass LifecycleOwner to items)

    Support binding to LiveData (pass LifecycleOwner to items)

    Since version 3.1 Android Studio supports databinding to LiveData. But in order to track changes of a LiveData field, ViewDataBinding object must be provided with LifecycleOwner which LastAdapter does not. So binding to LiveData via LastAdapter is efficiently onetime binding. Please, add possibility to pass LifecycleOwner into LastAdapter (probably, constructor argument will do fine).

    opened by lxyd 0
  • Crash on LayoutHandler in kotlin

    Crash on LayoutHandler in kotlin

    There is a problem with LayoutHandlerAdapter. I want to use it in my project, when LastAdapter with Layout is loader I've got KotlinNullPointerException. Here is my code: LastAdapter(viewModel.conversation, BR.item).layout { item, _ -> when(item) { is ContactItem -> { if (item.isCustomer) { R.layout.item_client } else { R.layout.item_service } } else -> R.layout.item_service } }.into(claimContactRv)

    When I use normal LastAdapter (without LayoutHandling) everything works well.

    I also run example project and get the same error. I paste it below.

    kotlin.KotlinNullPointerException at com.github.nitrico.lastadapter.LastAdapter.onBindViewHolder(LastAdapter.kt:109) at com.github.nitrico.lastadapter.LastAdapter.onBindViewHolder(LastAdapter.kt:27) at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6508) at com.github.nitrico.lastadapter.LastAdapter.onBindViewHolder(LastAdapter.kt:125) at com.github.nitrico.lastadapter.LastAdapter.onBindViewHolder(LastAdapter.kt:27) at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6541) at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5484) at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5750) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5589) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5585) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2231) at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1558) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1518) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:610) at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3719) at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3436) at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3988) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1197) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1769) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1197) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) at android.widget.FrameLayout.onLayout(FrameLayout.java:273) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:443) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) at android.widget.FrameLayout.onLayout(FrameLayout.java:273) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586) at android.widget.LinearLayout.onLayout(LinearLayout.java:1495) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336) at android.widget.FrameLayout.onLayout(FrameLayout.java:273) at com.android.internal.policy.PhoneWindow$DecorView.onLayout(PhoneWindow.java:2678) at android.view.View.layout(View.java:16630) at android.view.ViewGroup.layout(ViewGroup.java:5437) at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2171) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1931) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:606)

    opened by adammasyk 1
Owner
Miguel Ángel Moreno
Android developer
Miguel Ángel Moreno
RecyclerView Adapter Library with different models and different layouts as convenient as possible.

RecyclerView Presenter Convenience library to handle different view types with different presenters in a single RecyclerView. How to install repositor

Jan Rabe 86 Dec 26, 2022
A simple and easy adapter for RecyclerView. You don't have to make adapters and view holders anymore. Slush will help you.

한국어 No more boilerplate adapters and view holders. Slush will make using RecyclerView easy and fast. The goal of this project is to make RecyclerView,

SeungHyun 26 Sep 13, 2022
Android RecyclerView Adapter with nested items & expand/contract functionality

AccordionRecycler Android RecyclerView Adapter with nested items & expand/contract functionality With AccordionRecycler you can easily create awesome

Fanis Veizis 17 Aug 18, 2022
💡🚀⭐️ A generalized adapter for RecyclerView on Android which makes it easy to add heterogeneous items to a list

Mystique is a Kotlin library for Android’s RecyclerView which allows you to create homogeneous and heterogeneous lists effortlessly using an universal

Rahul Chowdhury 48 Oct 3, 2022
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

Jack and phantom 514 Jan 8, 2023
Cross-platform framework for building truly native mobile apps with Java or Kotlin. Write Once Run Anywhere support for iOS, Android, Desktop & Web.

Codename One - Cross Platform Native Apps with Java or Kotlin Codename One is a mobile first cross platform environment for Java and Kotlin developers

Codename One 1.4k Jan 9, 2023
Android MVVM framework write in kotlin, develop Android has never been so fun.

KBinding 中文版 Android MVVM framework write in kotlin, base on anko, simple but powerful. It depends on my another project AutoAdapter(A library for sim

Benny 413 Dec 5, 2022
use kmm to write a flutter plugin

use KMM to write a flutter plugin The reference plugin_codelab example plugin that accompanies the How to write a Flutter plugin codelab. I changed pl

libill 8 Nov 9, 2022
This repository is part of a Uni-Project to write a complete Compiler for a subset of Java.

Compiler This repository is part of a Uni-Project to write a complete Compiler for a subset of Java. Features error recovery using context sensitive a

null 3 Jan 10, 2022
Write a Ghidra Extension without using Java or Eclipse!

Ghidra Extension in Kotlin using IntelliJ IDEA Write a Ghidra Extension without using Java or Eclipse! Setup Hit Use this template at the top of the r

Florian Magin 7 Dec 15, 2022
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.

Martmists 14 Dec 26, 2022
The Android maps adapter

MapMe MapMe is an Android library for working with Maps. MapMe brings the adapter pattern to Maps, simplifying the management of markers and annotatio

Trade Me 849 Dec 27, 2022
Adapter library for SharedPreferences

EasyPrefs Adapter library for SharedPreferences which reduces boilerplate needed to store simple data, but open enough to not interfere with your own

Kacper Wojciechowski 6 Nov 23, 2021
Android sliding panel that is part of the view hierarchy, not above it.

sliding-panel A ViewGroup that implements a sliding panel that is part of the view hierarchy, not above it. Difference from other libraries All other

Pierfrancesco Soffritti 441 Nov 12, 2022
👋 A common toolkit (utils) ⚒️ built to help you further reduce Kotlin boilerplate code and improve development efficiency. Do you think 'kotlin-stdlib' or 'android-ktx' is not sweet enough? You need this! 🍭

Toolkit [ ?? Work in progress ⛏ ?? ??️ ?? ] Snapshot version: repositories { maven("https://s01.oss.sonatype.org/content/repositories/snapshots") }

凛 35 Jul 23, 2022
A template that utilizes both Scala and Kotlin because why not (And also because I endorse programming hell)

Fabric-Scala-Kotlin-template A template that utilizes both Scala and Kotlin because why not (And also because I endorse programming hell) I don't care

null 1 Dec 25, 2021
base url not included, rxJava, Retrofit

NewsFeed NewsFeed is an android sample application built using kotlin, androidx artifacts, kotlin-extensions in MVP pattern. Libraries Used Dagger 2 D

Sagar Raval 0 Dec 29, 2021
base url not included, rxJava, Retrofit

NewsFeed NewsFeed is an android sample application built using kotlin, androidx artifacts, kotlin-extensions in MVP pattern. Libraries Used Dagger 2 D

Sagar Raval 0 Dec 29, 2021
Blinking-image-view - A variant of Android View that blinks only the source image (not the background)

Blinker View for Android What is this? Blinker View is an Android View that blinks a given drawable. Yes, it's that simple. Place it in your layout an

Milos Marinkovic 4 Jul 29, 2020