- Notifications
You must be signed in to change notification settings - Fork31
(Published to MavenCentral) Kotlin way of building RecyclerView Adapter 🧩. You do not have to write RecyclerView Adapters again and again and suffer from handling of different view types. Kiel will help you.
License
ibrahimyilmaz/kiel
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Kiel is aRecyclerView.Adapter
with a minimalistic and convenient Kotlin DSL which provides utility on top of Android's normalRecyclerView.Adapter
.
Most of the time:
- We found ourselves repeating same boilerplate code for
RecyclerView.Adapter
. - We have difficulty in handling
RecyclerView.Adapter
when there are manyviewTypes
.
But now, Kiel may help us to get rid of these problems. You may read the detailed story inthis blog post.
val recyclerViewAdapter= adapterOf<Text> { register( layoutResource=R.layout.adapter_message_text_item, viewHolder= ::TextMessageViewHolder, onViewHolderCreated= { vh->//you may handle your on click listener vh.itemView.setOnClickListener { } }, onBindViewHolder= { vh, _, it-> vh.messageText.text= it.text vh.sentAt.text= it.sentAt } ) } recyclerView.adapter= recyclerViewAdapter
val pagingDataAdapterOf= pagingDataAdapterOf<Text> { register( layoutResource=R.layout.adapter_message_text_item, viewHolder= ::TextMessageViewHolder, onViewHolderCreated= { vh->//you may handle your on click listener vh.itemView.setOnClickListener { } }, onBindViewHolder= { vh, _, it-> vh.messageText.text= it.text vh.sentAt.text= it.sentAt } ) } recyclerView.adapter= recyclerViewAdapter
You may register differentViewHolder
s to your adapters.
register( layoutResource=R.layout.adapter_message_text_item, viewHolder= ::TextMessageViewHolder, onBindViewHolder= { vh, _, it-> vh.messageText.text= it.text vh.sentAt.text= it.sentAt } ) register( layoutResource=R.layout.adapter_message_image_item, viewHolder= ::ImageMessageViewHolder, onBindViewHolder= { vh, _, item-> vh.messageText.text= item.text vh.sentAt.text= item.sentAtGlide.with(vh.messageImage) .load(item.imageUrl) .into(vh.messageImage) } )
AsViewHolder
instance is accessible in:
onViewHolderCreated
onBindViewHolder
onBindViewHolderWithPayload
You can handle the events in the same way how you did it before.
val recyclerViewAdapter= adapterOf<Text> { register( layoutResource=R.layout.adapter_message_text_it, viewHolder= ::TextMessageViewHolder, onViewHolderCreated= { vh-> vh.itemView.setOnClickListener { } vh.messageText.addTextChangedListener{text-> } }, onBindViewHolder= { vh, _, it-> vh.messageText.text= it.text vh.sentAt.text= it.sentAt } ) }recyclerView.adapter= recyclerViewAdapter
AsViewHolder
instance is accessible in:
onViewHolderCreated
onBindViewHolder
onBindViewHolderWithPayload
You may define your ViewBinding in your ViewHolder class and you can easily reach it:
classTextMessageViewHolder(view:View) : RecyclerViewHolder<Text>(view) {val binding=AdapterTextItemBinding.bind(view)}val recyclerViewAdapter= adapterOf<Text> { register( layoutResource=R.layout.adapter_message_text_it, viewHolder= ::TextMessageViewHolder, onViewHolderCreated= { vh-> vh.binding. }, onBindViewHolder= { vh, _, it-> vh.binding.messageText.text= it.text vh.binding.sentAt.text= it.sentAt } ) }
val recyclerViewAdapter= adapterOf<MessageViewState> { diff( areContentsTheSame= { old, new-> old== new }, areItemsTheSame= { old, new-> old.message.id== new.message.id }, getChangePayload= { oldItem, newItem->val diffBundle=Bundle()if (oldItem.selectionState!= newItem.selectionState) { diffBundle.putParcelable(TextMessageViewHolder.KEY_SELECTION, newItem.selectionState ) }if (diffBundle.isEmpty)nullelse diffBundle } ) register ( layoutResource=R.layout.adapter_message_text_item, viewHolder= ::TextMessageViewHolder, onBindViewHolder= { vh, _, it-> vh.messageText.text= it.message.text vh.sentAt.text= it.message.sentAt } )
implementation'io.github.ibrahimyilmaz:kiel:latestVersion'
latestVersion =1.2.1
Copyright 2020 Ibrahim YilmazLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
About
(Published to MavenCentral) Kotlin way of building RecyclerView Adapter 🧩. You do not have to write RecyclerView Adapters again and again and suffer from handling of different view types. Kiel will help you.