Skip to content
This repository has been archived by the owner on Oct 28, 2022. It is now read-only.

Adapter Generation

Kaustubh Patange edited this page Aug 23, 2021 · 2 revisions

Generate

Read these tips to understand more about this processing.

Features

  • Supports standard RecyclerView.Adapter & ListAdapter generation.
  • Support for OnClick & OnLongClick methods.
  • Supports DiffUtil.ItemCallback generation method.
  • Support to load images through Glide.
  • Support for multiple view types, check sample-ktx.
  • Custom Linter to check incorrect implementation & auto fix it.
  • More?

Setup

implementation 'io.github.kaustubhpatange:autobindings-recyclerview:<version>'

// Kotlin
apply plugin: 'kotlin-kapt' // at top of your module build.gradle file
kapt 'io.github.kaustubhpatange:autobindings-compiler:<version>'
// Java
annotationProcessor 'io.github.kaustubhpatange:autobindings-compiler:<version>'

RecyclerView Adapter

There might be some breaking changes in future alpha releases.

  • A basic adapter consisting of a dataSet & are updated through adapter.notify* methods, usually used for the normal purposes.
@RecyclerViewAdapter(Data::class)
class TestAdapter {

    @GlideLoadArray(
        GlideLoad(R.id.image_id, "parameter-name", ...)
    )
    @OnBind(R.layout.item_layout_first)
    fun bind1(view: View, item: Data, position: Int) {
        // Set your views for first layout.
    }

    @OnBind(R.layout.item_layout_second, viewType = 2)
    fun bind2(view: View, item: Data, position: Int) {
        // Set your views for second layout.
    }

    @OnClick(R.id.item_id, viewType = 2)
    fun onClick(context: Context, item: Data, position: Int) {
        // OnClick for only second layout.
    }

    @OnLongClick(R.id.item_id)
    fun onLongClick(context: Context, item: Data, position: Int) {
        // OnClick for only first layout.
    }

    @ItemViewType
    fun viewType(position: Int): Int = 0
}
  • Compile the project and you'll have BindTestAdapter class generated (ready for use).
  • You can then use the BindTestAdapter class with recyclerView.
// Kotlin
recyclerView.adapter = BindTestAdapter(TestAdapter(), List<Data>)

//Java
recyclerView.setAdapter(new BindTestAdapter(new TestAdapter(), List<Data>));
  • Notice we're passing a new instance of TestAdapter as parameter because we don't want to allocate objects for every instance of BindTestAdapter even if we are not using it.

List Adapter

  • A modern way of writing adapter supporting diffutil callbacks.
@RecyclerViewListAdapter(Data::class)
class TestAdapter {

    @DiffItemSame
    fun itemSame(oldItem: Data, newItem: Data): Boolean {
        // DiffUtil.areItemsTheSame callback
    }

    @DiffContentSame
    fun contentSame(oldItem: Data, newItem: Data): Boolean {
        // DiffUtil.areContentsTheSame callback
    }

    ...
}
  • Compile the project and you'll have BindTestAdapter class generated (ready for use).
  • You can then use the BindTestAdapter class with recyclerView.

Notes

  • If you pass setInViewHolder = false in @OnClick or @OnLongClick, then the clicks will be generated in onBindViewHolder instead. This is useful if your listeners are dynamic (i.e your view updates are frequent).
  • You can set click listener for specific viewType, default is first OnBind().
  • A custom linter is provided within the library to handle specific compile-time errors.
Clone this wiki locally