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

Overview

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()
Comments
  • Sticky header is not working for custom view type

    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

    opened by satodia-smit 4
  • Dynamic nested recyclerview

    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
      }
    
    Feature request 
    opened by satodia-smit 4
  • Can't resolve smart-recycler-adapter-nestedadapter:1.0.0-alpha01

    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'

    opened by dacre-denny 3
  • Add ability to set DiffUtil via Builder, add Adapter.submitList()

    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()

    opened by P1NG2WIN 3
  • How to get LinearLayoutManager to display horizontal

    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

    enhancement 
    opened by HenryChigbo 3
  • Disable fade animation while updating data

    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

    opened by yodyyyy 0
  • Rc 5.0.0-rc01

    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.
    opened by manneohlund 0
  • Rc 5.0.0-beta05

    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
    opened by manneohlund 0
  • Rc 5.0.0-beta04

    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.
    opened by manneohlund 0
  • Rc 5.0.0

    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
    opened by manneohlund 0
  • Rc 5.0.0

    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

    opened by manneohlund 0
  • View Binding

    View Binding

    I am using this your adapter. With too much ease with your smart adapter, their is one difficulty I found. Please add view binding in smart view holder. We have to use findviewbyid to bind our views which is very old method. Thanks

    opened by SulemanIcon 0
  • Duplicate class when library used as a transative dependency

    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.

    opened by bensmiley 0
Releases(v5.0.0-rc01)
  • v5.0.0-rc01(Oct 19, 2020)

    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.
    Source code(tar.gz)
    Source code(zip)
  • v5.0.0-beta05(Oct 13, 2020)

    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
    Source code(tar.gz)
    Source code(zip)
  • v5.0.0-beta04(Oct 9, 2020)

    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.
    Source code(tar.gz)
    Source code(zip)
  • v5.0.0-beta03(Oct 6, 2020)

    Important

    This v5.0.0-beta03 release contains non backwards compatible changes.

    • This version has migrated all Diff Util extensions smart-recycler-adapter-diffutil:1.0.0-alpha01.

    What’s new

    • 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
    Source code(tar.gz)
    Source code(zip)
  • 5.0.0-beta02(Oct 3, 2020)

    Important

    This v5.0.0-beta02 release contains non backwards compatible changes.

    • This version has migrated all ViewEvent listeners & Touch listeners (drag & drop, swipe) to smart-recycler-adapter-viewevent:1.0.0-alpha02.

    What’s new

    General

    • Add library smart-recycler-adapter-viewevent:1.0.0-alpha02.
    • Add SmartViewHolderBinder interface
    • Add OnViewRecycledListener interface
    • Add OnSmartRecycleAdapterCreatedListener interface
    • Add OnCreateViewHolderListener interface
    • Add OnBindViewHolderListener interface
    • Changed OnViewAttachedToWindowListener and OnViewDetachedFromWindowListener to pure interfaces
    • Add default helper constructor with LayoutInflater to SmartViewHolder
    • Delete old ViewEvent file from old listeners module
    • Delete old ViewEvent listeners, state holders, binders, drag and drop, providers and factories
    • Moved SmartStateHolder from smartadapter to viewevent module
    • Feature added new SmartViewHolderBinder binding to SmartRecyclerAdapter and SmartAdapterBuilder for easy SmartViewHolder binding extension. a748c32
    • Fix smart-recycler-adapter-viewevent viewholder package location to package smartadapter.viewevent.viewholder

    More

    • Bump gradle 5.4.1 -> 6.1.1 & gradle build tools 3.5.0 -> 4.0.1
    • Bump kotlin 1.3.41 -> 1.3.72
    • Optimizations, minor refactoring, bug fixes
    Source code(tar.gz)
    Source code(zip)
  • 4.1.0(Jan 19, 2020)

    Important

    Setters setOnLoadMoreListener & setCustomLoadMoreLayoutResource has been removed and are now public properties in SmartEndlessScrollRecyclerAdapter db0a22c.

    What’s new

    • Bug fix with endless scroll or load more crash due to adapter inconsistency or invalid state while scrolling. #11
    • Better support for java kotlin interop data types
    • Minor fixes.
    Source code(tar.gz)
    Source code(zip)
  • 4.0.0(Sep 28, 2019)

    Important

    This v4.0.0 release contains non backwards compatible changes.

    • This version has migrated all library code to Kotlin.
    • No Java to Kotlin interop support added in this version.
    • ViewEventListeners has crossinline support for lambda calls.

    What’s new

    General

    • 100% translation into Kotlin.

    OnViewEventListener

    • New ViewEventListener implementation with Kotlin properties instead of java default method calls.
    • Library ViewEventListener extensions ex: OnItemClickListener, OnItemLongClickListener has crossinline lambda call helper methods.

    ViewHolder interfaces

    • Method calls has been replaced with properties in most Holders ex DraggableViewHolder, SmartAdapterHolder, ViewEventListenerHolder, StatefulViewHolder.

    More

    • Removed getViewEventListeners, use viewEventMapper.viewEventListenerMap atm.
    • SmartRecyclerAdapter takes both mutable and immutable lists, immutable lists are converted to mutable lists.
    • Optimizations, minor refactoring, bug fixes
    Source code(tar.gz)
    Source code(zip)
  • 3.0.0(Aug 30, 2019)

    Important

    This v3.0.0 release contains non backwards compatible changes.

    • This version has migrated to AndroidX.
    • Major refactoring to View Event implementation.
    • SmartViewHolder extensions SmartAutoEventViewHolder & SmartEventViewHolder has been removed, use OnItemClickListener & OnItemLongClickListener.
    • ViewEventHolder has been removed, use ViewEventListenerHolder instead.
    • ViewEventListener has been renamed to OnViewEventListener and has new methods.
    • Use jcenter() or direct maven { url "https://dl.bintray.com/manneohlund/maven" } repository.

    What’s new

    Dependencies

    • Migrated from android.support libraries to AndroidX.

    OnViewEventListener

    • New ViewEventListener implementation with OnViewEventListener.
    • Added basic OnItemClickListener.
    • Added basic OnItemLongClickListener.
    • Added ViewEventListenerHolder to replace ViewEventHolder.
    • Removed redundant SmartAdapterBuilder.addViewEventListener methods with overloading parameter.
    • Removed SmartViewHolder extensions SmartAutoEventViewHolder & SmartEventViewHolder.
    • Removed ViewEventHolder, use ViewEventListenerHolder instead.

    SmartStateHolder

    • Added SmartStateHolder with single & multi state handling like selection.
    • Added OnItemSelectedListener for basic view selection.
    • Added OnItemLongClickSelectedListener for long click enabled selection.

    Extensions

    • Added Swipe extension with OnItemSwipedListener.
    • Added Drag & Drop extension with OnItemMovedListener.
      • Supports Grid drag & drop with type awareness.

    SmartEndlessScrollRecyclerAdapter

    • Added passive load more button to internal LoadMoreViewHolder.

    More

    • Renaming of package and directory structure in sample app.
    • Renaming of package name in library.
    • Added more samples in demo app.
    • Fix bug in ViewTypeResolver.
    • Optimizations, minor refactoring, bug fixes.
    Source code(tar.gz)
    Source code(zip)
  • 2.2.0(Jul 31, 2019)

  • 2.1.0(Jul 23, 2019)

    • Added unbind method in SmartViewHolder, called when ViewHolder is recycled.
    • Added OnViewAttachedToWindowListener for SmartViewHolder extension implementation.
    • Added OnViewDetachedToWindowListener for SmartViewHolder extension implementation.
    • Added RecyclableViewHolder interface for SmartViewHolder extensions, called when the adapter fails to recycle the View/ViewHolder.
    • Removed global OnViewDetachedToWindowListener from SmartAdapterBuilder and SmartRecyclerAdapter.
    • Renaming of implementation class back to SmartRecyclerAdapter and interface definition to ISmartRecyclerAdapter avoid casting to Recycler.Adapter.
    • Support for both View and ViewGroup of overridden SmartViewHolder constructor parameter.
    • Internal optimisations and more tests.
    • Bug fixes and improvements.
    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Jul 2, 2019)

  • 2.0.0(Jul 1, 2019)

    • Support for complex nested SmartRecyclerAdapters
    • Simplified SmartViewHolder interface with SmartEventViewHolder & SmartAutoEventViewHolder extensions for view event handling.
    • Added create method to SmartAdapterBuilder
    • Fix animation triggers for adapter operations
    • Updated demo with multi nested adapter
    • Bug fixes and improvements
    Source code(tar.gz)
    Source code(zip)
  • 1.5.0(Jun 7, 2019)

  • 1.4.0(Apr 16, 2018)

  • 1.3.0(Apr 16, 2018)

  • 1.2.0(Dec 18, 2017)

  • 1.1.1(Oct 10, 2017)

  • 1.1.0(Oct 3, 2017)

  • 1.0.0(Jun 1, 2017)

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

lin 940 Dec 30, 2022
Generic RecyclerView adapter

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

Leonid Ustenko 77 Dec 24, 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

Lloyd Dcosta 1 Sep 30, 2021
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

Mike Penz 3.7k Jan 8, 2023
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

NAVER Z 106 Dec 23, 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.

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

Gustavo Pagani 1.7k Dec 21, 2022
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

Manuel Peinado Gallego 855 Nov 11, 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

Stan Kocken 423 Sep 16, 2022
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

Ragunath Jawahar 368 Nov 25, 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

Ami Goldenberg 287 Dec 22, 2022
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

Ahmed Rizwan 193 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

George Dzotsenidze 151 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.

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

Biraj Patel 270 Nov 25, 2022
[] 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

ribot 425 Nov 25, 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.

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

Biraj Patel 132 Nov 25, 2022
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

mapsforge 1k Jan 2, 2023
Generate data-view-binding adapters of android recycler view.

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

nekocode 253 Nov 11, 2022
Add RecyclerView, use Adapter class and ViewHolder to display data.

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

Shaima Alghamdi 3 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

Areg Petrosyan 42 Dec 23, 2022