Giter VIP home page Giter VIP logo

multiviewadapter's Introduction

Download

MultiViewAdapter

Library for easily displaying multiple view types in RecyclerView adapter. You don't even need to write custom adapter and ViewHolder.

Note: library is AndroidX-only

Setup

Library is available on jCenter

Add dependency to your app's build.gradle

dependencies {
    implementation "serg.chuprin:multiviewadapter:$latestVersion"
}

Also you can use adapter with kotlin-android-extensions

apply plugin: 'kotlin-android-extensions'

androidExtensions {
    experimental = true
}

dependencies {
    implementation "serg.chuprin:multiviewadapter-kt-extensions:$latestVersion"
}

How to use

Choose which adapter to use

  • MultiViewAdapter - if you don't have any strict type hierarchy, all items will have Any type
  • TypedMultiViewAdapter - if you have specific type (sealed class, for example)
  • DiffMultiViewAdapter - if you want to get benefit from automatic lists diffing and animations

Create renderer

Renderer - class that represents concrete view type and can render concrete model

If you want to get power of kotlin android-extensions and don't want to write ViewHolder, use ContainerRenderer.

Or you can use library in old way and create custom ViewRenderer

class UserRenderer : ContainerRenderer<UserEntity>() {

    override val type: Int = R.layout.list_item_user

    override fun bindView(holder: ContainerHolder, model: UserEntity) {
        holder.itemView.textView.text = model.login
    }
}

Register renderer

val adapter = MultiViewAdapter().apply {
    registerRenderer(UserRenderer())   
}

If you use Java, you need to specify type explicitly

MultiViewAdapter adapter = new MultiViewAdapter();
adapter.registerRenderer(new UserRenderer(), UserEntity.class);

Done!

Click listeners

To add click listener, override method onVhCreated in your renderer. Then set listener on the view.

class UserRenderer : ContainerRenderer<UserEntity>() {

    ...
    override fun onVhCreated(
        holder: ContainerHolder,
        clickListener: Click?,
        longClickListener: LongClick?
    ) {
        holder.itemView.userLogo.setOnClickListener {
            clickListener?.onClick(it, holder.layoutPosition)
        }
    }
}

Then react to click events:

adapter.clickListener = { model, view, position -> TODO() }

DiffUtil

Library has DiffMultiViewAdapter - the equivalent to ListAdapter from support library. It uses AsyncListDiffer internally for calculating diff on background thread. You don't need to care about any notifying adapter about data changes, just set new items!

multiviewadapter's People

Contributors

creati8e avatar

Stargazers

 avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.