Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ buildscript {
}

dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
classpath 'com.android.tools.build:gradle:4.1.2'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Fri Sep 18 12:35:33 CEST 2020
#Sat Feb 20 10:59:16 IRST 2021
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package smartrecycleradapter.feature
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_simple_item.recyclerView
import smartadapter.SmartRecyclerAdapter
import smartadapter.smartNotifyItemChange
import smartrecycleradapter.feature.simpleitem.SimpleItemViewHolder

/*
Expand All @@ -20,8 +21,18 @@ class SimpleItemActivity : BaseSampleActivity() {
val items = (0..100).toMutableList()

SmartRecyclerAdapter
.items(items)
.map(Integer::class, SimpleItemViewHolder::class)
.into<SmartRecyclerAdapter>(recyclerView)
.items(items)
.map(Integer::class, SimpleItemViewHolder::class)
.into<SmartRecyclerAdapter>(recyclerView).apply {
// The part of code ables change of item in positions with 500mls interval
Thread {
items.forEachIndexed { index, i ->
recyclerView.post { smartNotifyItemChange(index, i * index) }
Thread.sleep(500)
}
}.start()
}


}
}
50 changes: 32 additions & 18 deletions smartadapter/src/main/kotlin/smartadapter/SmartRecyclerAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ typealias Position = Int
*/
@Suppress("UNCHECKED_CAST")
open class SmartRecyclerAdapter
internal constructor(private var items: MutableList<Any>)
: RecyclerView.Adapter<SmartViewHolder<Any>>(), ISmartRecyclerAdapter {
internal constructor(private var items: MutableList<Any>)
: RecyclerView.Adapter<SmartViewHolder<Any>>(), ISmartRecyclerAdapter {

override var smartItemCount: Int = 0
override var viewHolderMapper: ViewHolderMapper = ViewHolderMapper()
Expand All @@ -82,9 +82,9 @@ open class SmartRecyclerAdapter
}
smartExtensions.values.forEach { extension ->
if (extension is SmartViewHolderBinder
&& (extension.viewHolderType == SmartViewHolder::class
|| extension.viewHolderType.isInstance(smartViewHolder))
&& extension is OnCreateViewHolderListener
&& (extension.viewHolderType == SmartViewHolder::class
|| extension.viewHolderType.isInstance(smartViewHolder))
&& extension is OnCreateViewHolderListener
) {
extension.onCreateViewHolder(this, smartViewHolder)
}
Expand All @@ -96,29 +96,29 @@ open class SmartRecyclerAdapter
smartViewHolder.bind(items[position])
smartExtensions.values.forEach { extension ->
if (extension is SmartViewHolderBinder
&& (extension.viewHolderType == SmartViewHolder::class
|| extension.viewHolderType.isInstance(smartViewHolder))
&& extension is OnBindViewHolderListener
&& (extension.viewHolderType == SmartViewHolder::class
|| extension.viewHolderType.isInstance(smartViewHolder))
&& extension is OnBindViewHolderListener
) {
extension.onBindViewHolder(this, smartViewHolder)
}
}
}

override fun onBindViewHolder(
smartViewHolder: SmartViewHolder<Any>,
position: Int,
payloads: MutableList<Any>
smartViewHolder: SmartViewHolder<Any>,
position: Int,
payloads: MutableList<Any>
) {
super.onBindViewHolder(smartViewHolder, position, payloads)
if (items.size != position) {
smartViewHolder.bind(items[position], payloads)
}
smartExtensions.values.forEach { extension ->
if (extension is SmartViewHolderBinder
&& (extension.viewHolderType == SmartViewHolder::class
|| extension.viewHolderType.isInstance(smartViewHolder))
&& extension is OnBindViewHolderListener
&& (extension.viewHolderType == SmartViewHolder::class
|| extension.viewHolderType.isInstance(smartViewHolder))
&& extension is OnBindViewHolderListener
) {
extension.onBindViewHolder(this, smartViewHolder, payloads)
}
Expand All @@ -130,9 +130,9 @@ open class SmartRecyclerAdapter
smartViewHolder.unbind()
smartExtensions.values.forEach { extension ->
if (extension is SmartViewHolderBinder
&& (extension.viewHolderType == SmartViewHolder::class
|| extension.viewHolderType.isInstance(smartViewHolder))
&& extension is OnViewRecycledListener
&& (extension.viewHolderType == SmartViewHolder::class
|| extension.viewHolderType.isInstance(smartViewHolder))
&& extension is OnViewRecycledListener
) {
extension.onViewRecycled(this, smartViewHolder)
}
Expand Down Expand Up @@ -331,7 +331,7 @@ open class SmartRecyclerAdapter
override fun add(extension: SmartExtensionIdentifier) {
(extension as? SmartRecyclerAdapterBinder)?.bind(this)
if (extension.identifier != extension::class
&& !smartExtensions.containsKey(extension.identifier)) {
&& !smartExtensions.containsKey(extension.identifier)) {
smartExtensions[extension.identifier] = extension
} else if (smartExtensions.containsKey(extension.identifier)) {
Log.e("SmartAdapterBuilder", "SmartAdapterBuilder already contains the key '${extension.identifier}', please consider override the identifier to be able to fetch the extension easily")
Expand Down Expand Up @@ -366,3 +366,17 @@ inline fun <reified T : SmartExtensionIdentifier> SmartRecyclerAdapter.get(ident
}
return smartExtensions[T::class] as T
}


/**
* Notifies the recycler adapter by new item at position has changed.
* Calls [ISmartRecyclerAdapter.smartNotifyItemChanged]
* @param position adapter position.
* @param item generic type of item.
*/
fun <T : Any> ISmartRecyclerAdapter.smartNotifyItemChange(position: Int, item: T) {
getItems().apply {
set(position, item)
smartNotifyItemChanged(position)
}
}