Small, smart and generic adapter for recycler view with easy and advanced data to ViewHolder binding.

Last update: Aug 7, 2022

smart-recycler-adapter

Download Android Arsenal Build Status

Never code any boilerplate RecyclerAdapter again! This library will make it easy and painless to map your data item with a target ViewHolder.

Features

OnViewEventListener
ItemTouchHelper Swipe, Drag & Drop extensions
ViewTypeResolver
SmartStateHolder
Sticky header
Nested adapter
Pagination
DiffUtil
Filter

Release overview

  • Extension libraries (ViewEvent, DiffUtil, NestedAdapter, StickyHeader, Filter) v5.0.0-rc01
  • Kotlin + AndroidX (jcenter, jitpack) v4.0.0
  • Java + AndroidX (jcenter, jitpack) v3.0.0
  • Java + AppCompat (jitpack) v2.2.0

Gradle

Add jcenter() or maven { url "https://dl.bintray.com/manneohlund/maven" } to your build.gradle under repositories

Core

dependencies {
  // Core SmartRecyclerAdapter
  implementation 'io.github.manneohlund:smart-recycler-adapter:5.0.0-rc01'
}

Extensions

dependencies {
  // ViewEvent click listeners, multi select, swipe dismiss and drag & drop
  implementation 'io.github.manneohlund:smart-recycler-adapter-viewevent:1.0.0-beta03'
  // DiffUtil extension library
  implementation 'io.github.manneohlund:smart-recycler-adapter-diffutil:1.0.0-beta01'
  // Nested adapter extension library
  implementation 'io.github.manneohlund:smart-recycler-adapter-nestedadapter:1.0.0-beta01'
  // Sticky header extension library
  implementation 'io.github.manneohlund:smart-recycler-adapter-stickyheader:1.0.0-alpha02'
  // Filter extension library
  implementation 'io.github.manneohlund:smart-recycler-adapter-filter:1.0.0-alpha01'
}

Basic

Basic adapter creation

SmartRecyclerAdapter
  .items(items)
  .map(MoviePosterModel::class, PosterViewHolder::class)
  .map(MovieBannerModel::class, BannerViewHolder::class)
  .map(MovieModel::class, MovieViewHolder::class)
  .map(TopNewsModel::class, TopNewsViewHolder::class)
  .add(OnClickEventListener { event: ViewEvent.OnClick -> 
    // Handle event
  })
  .into<SmartRecyclerAdapter>(recyclerView)

SmartViewHolder

Just extend your ViewHolder class with SmartViewHolder and pass in the target type ex SmartViewHolder<Mail>.
Note that the constructor can both take View or ViewGroup as parameter, in this case PosterViewHolder(parentView: ViewGroup) to avoid casting to ViewGroup while inflating.
The parentView is the recyclerView.
The method unbind has an default implementation and is optional.

class PosterViewHolder(parentView: ViewGroup) : 
  SmartViewHolder<MovieModel>(parentView, R.layout.poster_item) {

  override fun bind(movie: MovieModel) {
    Glide.with(imageView)
      .load(model.posterUrl)
      .into(imageView)
  }

  override fun unbind() {
    Glide.with(imageView).clear(imageView)
  }
} 

Works with Android DataBinding! Just add the DataBinding LayoutInflater in super call. 🚀

class PosterViewHolder(parentView: ViewGroup) : 
  SmartViewHolder<MovieModel>(
    LayoutInflater.from(parentView.context)
      .inflate(R.layout.poster_item, parentView, false)
  )

Adapter creation with ViewTypeResolver

If you want to bind one data type with different view holders depending on some attribute you can set a ViewTypeResolver.
Note .map() call not needed in this case but you can combine if you want to.

SmartRecyclerAdapter
  .items(items)
  .setViewTypeResolver{ item, position -> {
    when { 
      item is MovieTrailerModel -> MovieTrailerViewHolder::class
      item is MovieModel && item.isRatedR() -> RMovieViewHolder::class
      else -> MovieViewHolder::class // Add default view if needed, else SmartRecyclerAdapter will look at the base `.map` mapping
    }
  }}
  .into(recyclerView)

SmartEndlessScrollRecyclerAdapter

A popular feature in apps is to have endless scrolling with pagination, in other words load more items when user has scrolled to bottom. With SmartEndlessScrollRecyclerAdapter you can achieve this.

  • setAutoLoadMoreEnabled defines if false load more button should be visible before loading.
  • setLoadMoreLayoutResource can also set your custom loading/loadmore view.
  • OnLoadMoreListener is called when scrolled to the last item and loading view is visible.

Create SmartEndlessScrollRecyclerAdapter

val endlessScrollAdapter: SmartEndlessScrollRecyclerAdapter = SmartEndlessScrollRecyclerAdapter
  .items(items)
  .setAutoLoadMoreEnabled(true)
  .setLoadMoreLayoutResource(R.layout.custom_loadmore_view)
  .setOnLoadMoreListener { adapter,  loadMoreViewHolder ->
    // Handle load more items
  }
  .map(MovieModel::class, MovieViewHolder::class)
  .into(recyclerView)

More SmartEndlessScrollRecyclerAdapter features

Enable/Disable endless scrolling and thus removing the loading view. endlessScrollAdapter.isEndlessScrollEnabled = false

Extension libraries

smart-recycler-adapter-viewevent

As of smart-recycler-adapter:v5.0.0 all ViewEvent listeners have been removed from SmartRecyclerAdapter and added in this extension library smart-recycler-adapter-viewevent.

Essentially the SmartRecyclerAdapter will now hold a list of SmartViewHolderBinder that can implement any of these interfaces to listen to the adapter view holder stages:

  • OnSmartRecycleAdapterCreatedListener Invoked from SmartRecyclerAdapter init
  • OnCreateViewHolderListener Invoked from SmartRecyclerAdapter.onCreateViewHolder
  • OnBindViewHolderListener Invoked from SmartRecyclerAdapter.onBindViewHolder
  • OnViewAttachedToWindowListener Invoked from SmartRecyclerAdapter.onViewAttachedToWindow
  • OnViewDetachedFromWindowListener Invoked from SmartRecyclerAdapter.onViewDetachedFromWindow

This way all extension libraries has full control over the view holder lifecycle stages and can be hooked with various listeners and state holders.
You can create any type of SmartViewHolderBinder extension and implement any number of the listed adapter listeners.

View Events

In io.github.manneohlund:smart-recycler-adapter-viewevent comes with a range of ViewEvent listeners.
Default viewId is R.id.undefined that targets root view of the ViewHolder (ViewHolder.itemView).

SmartRecyclerAdapter
  .items(items)
  .map(MovieModel::class, MovieViewHolder::class)
  // Your ViewHolder must implement CustomViewEventListenerHolder & SmartAdapterHolder
  .add(OnCustomViewEventListener { event: ViewEvent -> })
  // Adds click event listener to all SmartViewHolder root itemView
  .add(OnClickEventListener { event: ViewEvent.OnClick -> })
  // Adds long click event listener to all SmartViewHolder root itemView
  .add(OnLongClickEventListener { event: ViewEvent.OnLongClick -> })
  // Adds click event listener to PosterViewHolder root itemView
  .add(OnClickEventListener(PosterViewHolder::class) { event: ViewEvent.OnClick -> })
  // Adds click event listener to PosterViewHolder on view with id R.id.playButton
  .add(OnClickEventListener(PosterViewHolder::class, R.id.playButton){ event: ViewEvent.OnClick -> })
  // Adds touch event listener to PosterViewHolder
  .add(OnTouchEventListener(PosterViewHolder::class) { event: ViewEvent.OnTouchEvent ->
    when(it.event.action) {
      MotionEvent.ACTION_UP -> // Handle touch event
    }
  })
  .into(recyclerView)

SmartStateHolder & ViewEventViewModel

With OnMultiItemSelectListener, OnMultiItemCheckListener, OnSingleItemSelectListener & OnSingleItemCheckListener you can easily keep track on selection states.

In combination with ViewEventViewModel you can keep selection states during screen rotation within the Activity lifecycle.
ViewEventViewModel provides a live data for the selection events.

OnMultiItemSelectListener

OnMultiItemSelectListener holds multi select states for recycler adapter positions and takes 4 arguments:

  • If enableOnLongClick is true multi select will be enabled after a long click, otherwise a regular ViewEvent.OnClick will be emitted when tapping.
  • viewId is by default R.id.undefined to target all SmartViewHolder.itemView.
  • viewHolderType is by default SmartViewHolder::class to target all view holders.
  • eventListener is by default noop in case of OnMultiItemSelectListener will be used with ViewEventViewModel along with live data observer.
// Define your ViewEventViewModel for OnMultiItemSelectListener to preserve state.
class MultiItemSelectViewModel :
  ViewEventViewModel<ViewEvent, OnMultiItemSelectListener>(
    OnMultiItemSelectListener(
      enableOnLongClick = true,
    )
)

// Get MultiItemSelectViewModel by androidx default viewModels provider.
private val multiItemSelectViewModel: MultiItemSelectViewModel by viewModels()

// Observe ViewEvent live data.
SmartRecyclerAdapter
  .items(items)
  .map(Integer::class, SimpleSelectableItemViewHolder::class)
  .add(multiItemSelectViewModel.observe(this) { event: ViewEvent ->
    // Either ViewEvent.OnClick or ViewEvent.OnItemSelected when enableOnLongClick = true
  })
  .into(recyclerView)

See sample app section: #SmartStateHolder

Drag & Drop

AutoDragAndDropBinder will be activated on long press if longPressDragEnabled = true
and on release the AutoDragAndDropBinder will automatically notify the SmartRecyclerAdapter about the item move.
You can extend the BasicDragAndDropBinder or DragAndDropEventBinder and create your custom implementation.

SmartRecyclerAdapter
  .items(items)
  .map(Integer::class, SimpleItemViewHolder::class)
  .add(AutoDragAndDropBinder(longPressDragEnabled = true) { event: ViewEvent.OnItemMoved ->
    // Handle drag event
  })
  .into(recyclerView)

See sample app section: #SmartStateHolder

Swipe dismiss

AutoRemoveItemSwipeEventBinder will automatically remove the item from the adapter on swipe.
You can extend the BasicSwipeEventBinder or SwipeEventBinder.kt and create your custom implementation.

SmartRecyclerAdapter
  .items(items)
  .map(Integer::class, SimpleItemViewHolder::class)
  .add(AutoRemoveItemSwipeEventBinder(ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) { event: ViewEvent.OnItemSwiped ->
    // Handle swipe event
  })
  .into(recyclerView)

See sample app section: #SmartStateHolder

smart-recycler-adapter-stickyheader

With io.github.manneohlund:smart-recycler-adapter-stickyheader it's super easy to add a sticky header recycler view item decoration.
Just set the target headerItemType and the StickyHeaderItemDecorationExtension will do the rest.
You can even add a sticky header item touch event listener.

SmartRecyclerAdapter
  .items(items)
  .map(String::class, SimpleHeaderViewHolder::class)
  .map(Integer::class, SimpleItemViewHolder::class)
  .add(StickyHeaderItemDecorationExtension(
    headerItemType = HeaderViewHolder::class
  ) { motionEvent, itemPosition ->
    if (motionEvent.action == MotionEvent.ACTION_UP) {
      showToast("Header $itemPosition clicked")
    }
  })
  .into(recyclerView)

See sample app section: #Sticky header

smart-recycler-adapter-diffutil

As of smart-recycler-adapter:v5.0.0 diff util have been removed from SmartRecyclerAdapter and is added in this extension library smart-recycler-adapter-diffutil.

Essentially the SmartRecyclerAdapter will now hold a map of SmartRecyclerAdapterBinder that is the basic interface for SmartRecyclerAdapter binding extensions.

// If adapter items contains unspecified super type DiffPredicate bust be of type Any, DiffPredicate<Any>
private val predicate = object : DiffUtilExtension.DiffPredicate<Int> {
  override fun areItemsTheSame(oldItem: Int, newItem: Int): Boolean {
    return oldItem == newItem
  }
    
  override fun areContentsTheSame(oldItem: Int, newItem: Int): Boolean {
    return oldItem == newItem
  }
}

// Add SimpleDiffUtilExtension to the adapter
SmartRecyclerAdapter
  .items((0..100).toMutableList())
  .map(Integer::class, SimpleItemViewHolder::class)
  .add(SimpleDiffUtilExtension(predicate))
  .into(recyclerView)

// Add some new random items
smartRecyclerAdapter.diffSwapList((0..100).shuffled().toMutableList())

See sample app section: #DiffUtil

smart-recycler-adapter-nestedadapter

As of smart-recycler-adapter:v5.0.0 static nested adapter mapping have been removed from SmartRecyclerAdapter and is added in this extension library smart-recycler-adapter-nestedadapter.
Default binder in nestedadapter is SmartNestedAdapterBinder implements SmartViewHolderBinder for basic view holder mapping functionality.
SmartRecyclerAdapter will hold the SmartNestedAdapterBinder references and call the default implemented interfaces OnCreateViewHolderListener, OnBindViewHolderListener, OnViewRecycledListener on ViewHolder lifecycle stages.
SmartViewHolder subclasses must implement SmartNestedRecyclerViewHolder in order for SmartNestedAdapterBinder to get the target recyclerView.

How does it work? 👇

SmartViewHolder

Sample uses kotlin synthetic view property import!

class NestedRecyclerViewHolder(parentView: ViewGroup) :
  SmartViewHolder<MovieCategory>(parentView, R.layout.nested_recycler_view),
  SmartNestedRecyclerViewHolder {

  override val recyclerView: RecyclerView = itemView.nestedRecyclerView

  init {
        // Set RecyclerView properties here or with RecyclerViewBinder
    itemView.nestedRecyclerView.apply {
      layoutManager = LinearLayoutManager(context, HORIZONTAL, false)
      isNestedScrollingEnabled = false
      setHasFixedSize(true)
    }
  }

  override fun bind(item: MovieCategory) {
    itemView.title.text = item.title
  }
}

SmartRecyclerAdapter

SmartNestedAdapterBinder will only target NestedRecyclerViewHolder.
Supply a SmartAdapterBuilder or SmartEndlessScrollAdapterBuilder that will be build a new nested adapter for each NestedRecyclerViewHolder. With reuseParentAdapterRecycledViewPool set to true will reuse the parent SmartRecyclerAdapters RecyclerView.RecycledViewPool in all nested adapters.

SmartRecyclerAdapter
  .items(items)
  .add(
    SmartNestedAdapterBinder(
      viewHolderType = NestedRecyclerViewHolder::class,
      reuseParentAdapterRecycledViewPool = true,
      smartRecyclerAdapterBuilder = SmartRecyclerAdapter.empty()
        .map(MovieModel::class, ThumbViewHolder::class)
        .add(OnClickEventListener { event: ViewEvent.OnClick ->
          // Handle nested adapter item click event
        })
    )
  )
  .add(OnClickEventListener(NestedRecyclerViewHolder::class, R.id.more) {
    // Handle parent adapter click event
  })
  .into(recyclerView)

See sample app section: #Nested SmartRecyclerAdapters

smart-recycler-adapter-filter

With the FilterExtension extension you can synchronously or asynchronously filter your items.

Create SmartRecyclerAdapter

SmartRecyclerAdapter.items(items)
  .map(String::class, HeaderViewHolder::class)
  .map(Int::class, FilterItemViewHolder::class)
  .add(OnClickEventListener {
    // Handle click event
  })
  .add(
    FilterExtension(
      filterPredicate = { item, constraint ->
        when (item) {
          is Int -> item.toString().contains(constraint)
          else -> true
        }
      },
      loadingStateListener = { isLoading ->
        // Set loading progress visibility
      }
    )
  )
  .into(recyclerView)

Set search view filter

searchView.setOnQueryTextListener(object : android.widget.SearchView.OnQueryTextListener {
    // Call some filter function ex: filter(newText)
})

Filter

fun filter(query: String?) {
  val filterExtension: FilterExtension = smartAdapter.get()

  filterExtension.filter(lifecycleScope, query, autoSetNewItems = true)
}

See sample app section: #Filter

Proguard

Only known rule is to keep constructor for all ViewHolders.
This rule is auto included in the consumer-rules.pro for smart-recycler-adapter library so no manual config is needed.

-keepclassmembers class **ViewHolder {
    public <init>(**);
}

More

For more samples test out the sample app and see the source code.

RecyclableViewHolder

Sometimes a ViewHolder created by the Adapter cannot be recycled due to its transient state.
In order to fix this is to implement RecyclableViewHolder in your SmartViewHolder extension so that upon receiving this callback, Adapter can clear the animation(s) that effect the View's transient state and return true so that the View can be recycled.

class MovieViewHolder : SmartViewHolder, RecyclableViewHolder {
  override fun onFailedToRecycleView(): Boolean = true
}

OnViewAttachedToWindowListener and OnViewDetachedFromWindowListener

If you want to catch when the view is attached and detached from the window in your ViewHolder you can implement OnViewAttachedToWindowListener and OnViewDetachedFromWindowListener in your SmartViewHolder extension.

Becoming detached from the window is not necessarily a permanent condition the consumer of an Adapter's views may choose to cache views offscreen while they are not visible, attaching and detaching them as appropriate.

class MovieViewHolder : SmartViewHolder, 
    OnViewAttachedToWindowListener, 
    OnViewDetachedFromWindowListener { 

  override fun onViewAttachedToWindow(viewHolder: RecyclerView.ViewHolder) {
    // Restore
  }

  override fun onViewDetachedFromWindow(viewHolder: RecyclerView.ViewHolder) {
    // Cache
  }
}

More SmartRecyclerAdapter features

val adapter: SmartRecyclerAdapter = SmartRecyclerAdapter
    .items(items)
    .map(MovieModel::class, MovieViewHolder::class)
    .into(recyclerView)

// We can add more data
adapter.addItems(items)

// Add data at index with animation
adapter.addItem(0, item)

// Add data at index without animation
adapter.addItem(0, item, false)

// Remove item at index with animation
adapter.removeItem(0)

// Remove item at index without animation
adapter.removeItem(0, false)

// Replace item at index with animation
adapter.replaceItem(0, item)

// Replace item at index without animation
adapter.replaceItem(0, item, false)

// Get items by type
adapter.getItems(MovieModel::class)

// Delete all items in the list
adapter.clear()

GitHub

https://github.com/manneohlund/smart-recycler-adapter
Comments
  • 1. Sticky header is not working for custom view type

    Hi @manneohlund , thanks for constanly updating this lib and adding new feature, however while working with newly available feature of sticky header, I got the header but it is not being sticky, can you please have a look? thanks again for your hardwork

    val mContinentArray = mutableListOf<String>()
            mContinentArray.add("Header")
            for (i in 1..100) {
                mContinentArray.add("Item $i")
            }
    
    val items = mContinentArray.mapIndexed { index, item ->
                when (index) {
                    0 -> arrayOf(Continent(item))
                    else -> arrayOf(Country(item))
                }
            }.toTypedArray().flatten()
    
            adapter = SmartRecyclerAdapter
                .items(items)
                .map(Continent::class, StickyHeaderParentVH::class)
                .map(Country::class, StickyHeaderChildVH::class)
                .setLayoutManager(layoutManager)
                .add(StickyHeaderItemDecorationExtension(
                    headerItemType = StickyHeaderParentVH::class
                ) { motionEvent, itemPosition ->
                    if (motionEvent.action == MotionEvent.ACTION_UP) {
                        context?.showToast("Header $itemPosition clicked")
                    }
                })
                .into(rvContinent)
    

    Please check the gif outcome App run outcome

    Reviewed by satodia-smit at 2020-10-25 12:51
  • 2. Dynamic nested recyclerview

    Hi @manneohlund , Thanks for the great library, however I wanted to build header recyclerview same as demo you have provided(Main recyclerview Verticle scroll and subrecycleview Horizontal scroll)

    Statically with multiple viewholders its possible, but for dynamic can you please tell me how to do that

        private fun initSmartRecyclerAdapter(
            view: View,
            listData: ArrayList<MainModel>
        ) {
            val items = mutableListOf<MyWatchListModel>()
            listData.forEach {
                items.add(MyWatchListModel(it.header))
            }
            initNestedSmartRecyclerAdapters(listData)
    
            SmartRecyclerAdapter
                .items(items)
                .map(MyWatchListModel::class, MyWatchListViewHolder::class)
                .map(MyWatchListViewHolder::class, myWatchListSmartMovieAdapter)
                .into<SmartRecyclerAdapter>(view.rvEditorImg)
        }
    
        private fun initNestedSmartRecyclerAdapters(items: ArrayList<MainModel>) {
            myWatchListSmartMovieAdapter = SmartRecyclerAdapter
                _**.items(items[0].subData)** //here how to pass the data by which it could work properly_
                .map(SubModel::class, ThumbViewHolder::class)
                .create()
        }
    

    My Datasource:

    private fun fillData(): ArrayList<MainModel> {
          val submodel1 =
              SubModel("https://raw.githubusercontent.com/manneohlund/smart-recycler-adapter-resources/master/thumbs/joker.jpg")
          val subModel2 =
              SubModel("https://raw.githubusercontent.com/manneohlund/smart-recycler-adapter-resources/master/thumbs/first_man.jpg")
    
          val mainModel1 = MainModel("White Love", mutableListOf(submodel1, subModel2))
    
    
          val submodel3 =
              SubModel("https://raw.githubusercontent.com/manneohlund/smart-recycler-adapter-resources/master/thumbs/hellboy.jpg")
          val subModel4 =
              SubModel("https://raw.githubusercontent.com/manneohlund/smart-recycler-adapter-resources/master/thumbs/predator.jpg")
    
          val mainModel2 = MainModel("Sexy black", mutableListOf(submodel3, subModel4))
    
          val mutableList = arrayListOf(mainModel1, mainModel2)
          return mutableList
      }
    
    Reviewed by satodia-smit at 2020-06-16 09:05
  • 3. Can't resolve smart-recycler-adapter-nestedadapter:1.0.0-alpha01

    Getting error: Failed to resolve: io.github.manneohlund:smart-recycler-adapter-nestedadapter:1.0.0-alpha01

    When including: implementation 'io.github.manneohlund:smart-recycler-adapter-nestedadapter:1.0.0-alpha01'

    Reviewed by dacre-denny at 2020-10-17 09:55
  • 4. Add ability to set DiffUtil via Builder, add Adapter.submitList()

    PLEASE REVIEW AND TEST IT PLEASE CHECK signingConfigs (RELEASE), I HAD PROBLEMS WITH IT SO COMMENTED IT.

    Add ability to set diff util via Builder and later submitList to DiffUtil via new method Adapter.submitList()

    Reviewed by P1NG2WIN at 2020-09-23 16:10
  • 5. How to get LinearLayoutManager to display horizontal

    Hello, I added this to my RecyclerView LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

    But still, smart-recycler-adapter still displays it items vertical. How can I make it display Linear horizontal.

    Thanks for this library

    Reviewed by HenryChigbo at 2019-08-30 11:38
  • 6. Disable fade animation while updating data

    Hello, is it possible to disable fade animation? I followed the docs by adding false, but data not updating

    // Replace item at index without animation
    adapter.replaceItem(0, item, false)
    

    Thank you

    Reviewed by yodyyyy at 2021-02-05 09:42
  • 7. Rc 5.0.0-rc01

    Important

    This smart-recycler-adapter v5.0.0-rc01 release contains non backwards compatible changes.

    • Moved ItemTouchBinder, SmartRecyclerAdapterExtension, SmartExtensionBuilder, SmartViewHolderBinder to extension package.
    • Removed and replaced addBinder(SmartViewHolderBinder) & addExtension(SmartRecyclerAdapterExtension) methods with add(SmartExtensionIdentifier).
    • Removed and replaced viewHolderBinders & smartRecyclerAdapterExtensions with single smartExtensions map source.
    More changes
    • Added SmartExtensionIdentifier and segregated identifier from SmartRecyclerAdapterExtension.
    • Added SmartExtensionIdentifier extension to SmartViewHolderBinder.

    What’s new

    General

    • Bump smart-recycler-adapter from 5.0.0-beta05 to 5.0.0-rc01.
    • Bump smart-recycler-adapter-nestedadapter from 1.0.0-alpha01 to 1.0.0-beta01.
    • Bump smart-recycler-adapter-diffutil from 1.0.0-alpha01 to 1.0.0-beta01.
    • Bump smart-recycler-adapter-viewevent from 1.0.0-beta02 to 1.0.0-beta03.
    • Bump smart-recycler-adapter-stickyheader from 1.0.0-alpha01 to 1.0.0-alpha02.
    • Added initital smart-recycler-adapter-filter v1.0.0-alpha01 library.
    • Added common-library-config.gradle to all extension libraries.

    smart-recycler-adapter

    • Moved ItemTouchBinder, SmartRecyclerAdapterExtension, SmartExtensionBuilder, SmartViewHolderBinder to extension package
    • Added SmartExtensionIdentifier and segregated identifier from SmartRecyclerAdapterExtension
    • Added SmartExtensionIdentifier extension to SmartViewHolderBinder
    • Removed and replaced addBinder(SmartViewHolderBinder) & addExtension(SmartRecyclerAdapterExtension) methods with add(SmartExtensionIdentifier)
    • Removed and replaced viewHolderBinders & smartRecyclerAdapterExtensions with smartExtensions
    • Added RecyclerViewConfigBuilder file
    • Added SmartExtension smart get method for SmartRecyclerAdapter
    • Added getItemCast
    • Fixed OnDetachedFromRecyclerViewListener & OnAttachedToRecyclerViewListener invocations

    ViewEvent v1.0.0-beta02

    Added

    • Added identifier override
    • Added androidx.appcompat:appcompat for runtime resolving R.attr.selectableItemBackground

    Removed

    • Removed SmartAdapterBuilderExt with helper methods

    Moved

    • Moved binder and util packages to extensions

    Diff Util v1.0.0-beta01

    Added

    • kotlinx-coroutines-android for fast threading.
    • lifecycle-runtime-ktx in combination with coroutines for lifecycle aware launch/cancellation of coroutines.
    • diffSwapList async method with lifecycleScope coroutine job launch for heavy data computation.
    • cancelDiffSwapJob method to cancel ongoing coroutine job.
    • loadingStateListener for async loading state callback.

    Removed

    • SmartAdapterBuilderExt with extension methods

    Nested Adapter v1.0.0-beta01

    Added

    • RecyclerViewBinder invocation for SmartNestedRecyclerViewHolder for easy RecyclerView configuration in SmartAdapterBuilder
    • reuseParentAdapterRecycledViewPool to reuse parent SmartRecyclerAdapter RecyclerView.RecycledViewPool into nested adapters. Default is shared recycledViewPool for nested adapters

    Sticky Header v1.0.0-alpha02

    Moved

    • Moved SmartRecyclerAdapterExtension from binder package to extension

    Filter v1.0.0-alpha01

    Initial release contains

    • kotlinx-coroutines-android for fast threading.
    • lifecycle-runtime-ktx in combination with coroutines for lifecycle aware launch/cancellation of coroutines.
    • Basic implementation of item filtering with targetFilterTypes, loadingStateListener & filter predicate callback.
    Reviewed by manneohlund at 2020-10-19 10:35
  • 8. Rc 5.0.0-beta05

    What’s new

    General

    • Bump smart-recycler-adapter from 5.0.0-beta04 to 5.0.0-beta05.
      • Feature added OnAttachedToRecyclerViewListener & OnDetachedFromRecyclerViewListener to smart-recycler-adapter library
    • Bump smart-recycler-adapter-viewevent from 1.0.0-beta01 to 5.0.0-beta02.
      • Feature enable and disable all selectableItemType for OnMultiItemSelectListener
    • Add initital smart-recycler-adapter-stickyheader:1.0.0-alpha01 library.

    More

    • Fix broken movie data item in sample app
    • Add compileOptions & kotlinOptions to build gradle
    Reviewed by manneohlund at 2020-10-13 09:39
  • 9. Rc 5.0.0-beta04

    Important

    This smart-recycler-adapter v5.0.0-beta04 release contains non backwards compatible changes.

    • This version has migrated all Nested Adapter feature to smart-recycler-adapter-nestedadapter:1.0.0-alpha01.
    • A new SmartEndlessScrollRecyclerAdapter parameter has been added to OnLoadMoreListener for SmartEndlessScrollRecyclerAdapter.

    What’s new

    General

    • Bump smart-recycler-adapter from 5.0.0-beta03 to 5.0.0-beta04.
    • Bump smart-recycler-adapter-viewevent from 1.0.0-alpha02 to 5.0.0-beta01.
    • Add library smart-recycler-adapter-nestedadapter:1.0.0-alpha01.
    • Add SmartEndlessScrollAdapterBuilder and fix multiple SmartRecyclerAdapter creation from a single SmartAdapterBuilder.
    • Fix viewHolderType check to isInstanceOf instead of 1:1 check for viewHolderTypes in SmartRecyclerAdapter.
    • Deprecate and removed smartRecyclerAdapterMapper in SmartRecyclerAdapter, now use smart-recycler-adapter-nestedadapter
    • Fix potential crash in viewevent module on collections item position swap.
    • Add missing properties from SmartEndlessScrollRecyclerAdapter to SmartEndlessScrollAdapterBuilder
    • Add SmartEndlessScrollRecyclerAdapter param to OnLoadMoreListener.
    Reviewed by manneohlund at 2020-10-09 09:36
  • 10. Rc 5.0.0

    • Add CHANGELOG to smart-recycler-adapter-viewevent
    • Add initital smart-recycler-adapter-diffutil v1.0.0-alpha01 library
    • Bump smart-recycler-adapter from 5.0.0-beta02 to 5.0.0-beta03
    • Update README with smart-recycler-adapter-diffutil library samples
    • Fix smart-recycler-adapter consumer proguard rules
    • Update sample app
    • Fix README links
    Reviewed by manneohlund at 2020-10-06 10:21
  • 11. Rc 5.0.0

    Fix viewholder package location to package smartadapter.viewevent.viewholder Bump smart-recycler-adapter-viewevent from 1.0.0-alpha01 to 1.0.0-alpha02 Bump smart-recycler-adapter from 5.0.0-beta01 to 5.0.0-beta02 Update sample app Fix README links

    Reviewed by manneohlund at 2020-10-04 00:23
  • 12. Duplicate class when library used as a transative dependency

    I have a popular open-source library and I'm using SmartRecyclerAdapter for some of the table views. However, when I include the dependency in my project and push it to Bintray, if I include the library I get these errors:

    Duplicate class io.github.manneohlund.smartrecycleradapter.viewevent.BuildConfig found in modules 
    
    jetified-smart-recycler-adapter-viewevent-1.0.0-beta03-runtime (io.github.manneohlund.smart-recycler-adapter:smart-recycler-adapter-viewevent:5.0.0-rc01) and jetified-smart-recycler-adapter-viewevent-1.0.0-beta03-runtime (io.github.manneohlund:smart-recycler-adapter-viewevent:1.0.0-beta03)
    
    Duplicate class smartadapter.viewevent.dragdrop.AutoDragAndDropBinder found in modules 
    
    jetified-smart-recycler-adapter-viewevent-1.0.0-beta03-runtime (io.github.manneohlund.smart-recycler-adapter:smart-recycler-adapter-viewevent:5.0.0-rc01) and jetified-smart-recycler-adapter-viewevent-1.0.0-beta03-runtime (io.github.manneohlund:smart-recycler-adapter-viewevent:1.0.0-beta03)
    

    chat-sdk-android-v5-gradle.zip

    Here is a project that demonstrates the issue. To summarise. When Library A includes the dependency:

    api 'io.github.manneohlund:smart-recycler-adapter:5.0.0-rc01'
    api 'io.github.manneohlund:smart-recycler-adapter-viewevent:1.0.0-beta03'
    

    If library A is published to Bintray and Library B includes a dependency to library A, these errors appear. Your project is great and it would be a shame if it couldn't be included in third-party projects.

    Reviewed by bensmiley at 2021-03-05 12:24
  • 13. implemented smartNotifyItemChange() notify data on specific ViewHolder

    • update com.android.tools.build:gradle to 4.1.2
    • update gradle to gradle-6.5-all
    • impl smartNotifyItemChange(postion , T) notify of item in position
    • impl smartNotifyItemChange in SimpleItemActivity for sample.
    Reviewed by ImanX at 2021-02-20 09:14
A slim & clean & typeable Adapter without# VIEWHOLDER
A slim & clean & typeable Adapter without# VIEWHOLDER

PLEASE NOTE, THIS PROJECT IS NO LONGER BEING MAINTAINED First At A Glance :) Intro A slim & clean & typeable Adapter without# VIEWHOLDER Features No V

Jul 24, 2022
Generic RecyclerView adapter

Generic RecyclerView Adapter. Lightweight library which simplifies creating RecyclerView adapters and illuminates writing boilerplate code. Creating a

May 2, 2022
The powerfull Diff Util in Android Recycler View

DiffUtil The powerfull Diff Util in Android Recycler View What is RecyclerView ? RecyclerView is flexible and efficient version of ListView. It is an

Sep 30, 2021
The bullet proof, fast and easy to use adapter library, which minimizes developing time to a fraction...
The bullet proof, fast and easy to use adapter library, which minimizes developing time to a fraction...

FastAdapter The FastAdapter is here to simplify creating adapters for RecyclerViews. Don't worry about the adapter anymore. Just write the logic for h

Aug 9, 2022
Android library for the adapter view (RecyclerView, ViewPager, ViewPager2)
Android library for the adapter view (RecyclerView, ViewPager, ViewPager2)

Antonio Android library for the adapter view (RecyclerView, ViewPager, ViewPager2) Free from implementation of the adapter's boilerplate code ! Reuse

Jul 5, 2022
An Adapter that allows a RecyclerView to be split into Sections with headers and/or footers. Each Section can have its state controlled individually.
An Adapter that allows a RecyclerView to be split into Sections with headers and/or footers. Each Section can have its state controlled individually.

⚠️ Archived: this repository is no longer going to be maintained. SectionedRecyclerViewAdapter An Adapter that allows a RecyclerView to be split into

Aug 5, 2022
Android - A ListView adapter with support for multiple choice modal selection
Android - A ListView adapter with support for multiple choice modal selection

MultiChoiceAdapter MultiChoiceAdapter is an implementation of ListAdapter which adds support for modal multiple choice selection as in the native Gmai

Jun 19, 2022
Create a new adapter for a RecyclerView or ViewPager is now much easier.

Efficient Adapter for Android Create a new adapter for a RecyclerView or ViewPager is now much easier. Overview Create a list of elements into a Recyc

Jul 14, 2021
Adapter Kit is a set of useful adapters for Android.
Adapter Kit is a set of useful adapters for Android.

Adapter Kit Adapter Kit is a set of useful adapters for Android. The kit currently includes, Instant Adapter Instant Cursor Adapter Simple Section Ada

Aug 8, 2022
Simplify Adapter creation for your Android ListViews.

FunDapter takes the pain and hassle out of creating a new Adapter class for each ListView you have in your Android app. It is a new approach to custom

Aug 8, 2022
Rx based RecyclerView Adapter
Rx based RecyclerView Adapter

RxRecyclerAdapter Rx based generic RecyclerView Adapter Library. How to use it? Example! Enable Databinding by adding these lines to your build.gradle

Jun 18, 2022
This Repository simplifies working with RecyclerView Adapter

AutoAdapter This Repository simplifies working with RecyclerView Adapter Gradle: Add it in your root build.gradle at the end of repositories: allproj

Aug 15, 2021
This library provides GridAdapters(ListGridAdapter & CursorGridAdapter) which enable you to bind your data in grid card fashion within android.widget.ListView, Also provides many other features related to GridListView.
This library provides GridAdapters(ListGridAdapter & CursorGridAdapter) which enable you to bind your data in grid card fashion within android.widget.ListView, Also provides many other features related to GridListView.

GridListViewAdapters This libarary enables you to implement GridView like card layout within ListView with added capabilites like Paginations, Additio

Aug 25, 2021
[] Easy Adapters library for Android

Deprecated Due to the growing use of the RecyclerView and the RecyclerView.Adapter provided adapter class, Easy-Adapter is now deprecated. Whilst the

Jun 18, 2022
This library provides Easy Android ListView Adapters(EasyListAdapter & EasyCursorAdapter) which makes designing Multi-Row-Type ListView very simple & cleaner, It also provides many useful features for ListView.
This library provides Easy Android ListView Adapters(EasyListAdapter & EasyCursorAdapter) which makes designing Multi-Row-Type ListView very simple & cleaner, It also provides many useful features for ListView.

EasyListViewAdapters Whenever you want to display custom items in listview, then only way to achieve this is to implement your own subclass of BaseAda

Jun 27, 2021
Vector map library and writer - running on Android and Desktop.
Vector map library and writer - running on Android and Desktop.

Mapsforge See the integration guide and changelog. And read through how to contribute guidelines. If you have any questions or problems, don't hesitat

Aug 8, 2022
Generate data-view-binding adapters of android recycler view.

Items 这个库可以为 Android 的 RecyclerView 生成基于 Data-View-Binding 的 Adapter。 对比其他一些类似的开源库,它有以下的一些优势: 更好的拓展性。这个库不需要你继承特定的 Adapter 或 ViewHolder 类,你可以继承任何第三方提供的

Jul 7, 2022
Add RecyclerView, use Adapter class and ViewHolder to display data.
Add RecyclerView, use Adapter class and ViewHolder to display data.

فكرة المشروع في هذا المشروع سنقوم بعرض قائمة من البيانات للطلاب على واجهة تطبيق Android بإستخدام: مفهوم RecyclerView مفهوم Adapter مفهوم ViewModel محت

Nov 18, 2021
A sample project in Kotlin to demonstrate AndroidX, MVVM, Coroutines, Hilt, Room, Data Binding, View Binding, Retrofit, Moshi, Leak Canary and Repository pattern.

This repository contains a sample project in Kotlin to demonstrate AndroidX, MVVM, Coroutines, Hilt, Room, Data Binding, View Binding, Retrofit, Moshi, Leak Canary and Repository pattern

Aug 9, 2022