If someone is interested in implementing the old method ..
I posted a complete example that also reduces the code of your adapter. It uses the old callback receiving pattern.
Project level gradle
buildscript { ext.kotlin_version = '1.3.10' repositories { google() mavenCentral() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.2.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"//newly added classpath 'com.google.gms:google-services:4.1.0' // google-services plugin // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { google() mavenCentral() jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
Gradle Application Level
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-android-extensions' apply plugin: 'org.jetbrains.kotlin.android.extensions'//it is used for @Percelize android { compileSdkVersion 28 dataBinding { enabled = true } androidExtensions { experimental = true } defaultConfig { applicationId 'broadpeak.firebase.learning' minSdkVersion 19 targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { } } /*kapt { generateStubs = true }*/ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:design:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.google.firebase:firebase-core:16.0.5' implementation 'com.google.firebase:firebase-firestore:17.1.3' implementation 'com.google.firebase:firebase-auth:16.0.5' implementation 'com.google.firebase:firebase-messaging:17.3.4' implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.firebaseui:firebase-ui-auth:4.1.0' implementation 'com.github.bumptech.glide:glide:4.8.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' ////kapt "com.android.databinding:compiler:$android_plugin_version"\ // not required above 3.2.0 ///kapt "com.android.databinding:compiler:3.1.4" testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' } // ADD THIS AT THE BOTTOM apply plugin: 'com.google.gms.google-services'
SubjectListActivity.class
class SubjectListActivity : BaseActivity() { var subjects = mutableListOf<SubjectBO>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.question_list_activity) recycler_view.itemAnimator = DefaultItemAnimator() recycler_view.setHasFixedSize(true) recycler_view.layoutManager = LinearLayoutManager(this@SubjectListActivity) db.collection("tagCollection").get().addOnSuccessListener { querySnapshot -> if (querySnapshot.isEmpty()) { Log.d(TAG, "onSuccess: LIST EMPTY") } else {
SubjectAdapter.class
class SubjectAdapter(items: List<SubjectBO>, onRecyclerItemClickListener: OnRecyclerItemClickListener) : BaseAdapter<SubjectBO, SubjectViewHolder>(items, onRecyclerItemClickListener) { override fun onCreateViewHolder(parent: ViewGroup, p1: Int): SubjectViewHolder { return SubjectViewHolder(parent, R.layout.item_subject, onRecyclerItemClickListener) } }
SubjectViewHolder.class
class SubjectViewHolder(parent: ViewGroup, itemLayoutId: Int, onRecyclerItemClickListener: OnRecyclerItemClickListener) : BaseViewHolder<SubjectBO>(parent, itemLayoutId, onRecyclerItemClickListener) { override fun bindData(data: SubjectBO) { itemView.tvTitle.setText(data.tagName) } }
BaseAdapter.class
abstract class BaseAdapter<T, U : BaseViewHolder<T>> (var items: List<T>, var onRecyclerItemClickListener: OnRecyclerItemClickListener) : RecyclerView.Adapter<U>() { override fun getItemCount(): Int { return items.size } override fun onBindViewHolder(holder: U, pos: Int) { holder.bindData(items.get(pos)) } }
BaseViewHolder.class
abstract class BaseViewHolder<T : BaseModel>(parent: ViewGroup, @LayoutRes itemLayoutId: Int, var onRecyclerItemClickListener: OnRecyclerItemClickListener) : RecyclerView.ViewHolder(LayoutInflater.from(parent.context).inflate(itemLayoutId, parent, false)), View.OnClickListener { override fun onClick(v: View?) { onRecyclerItemClickListener.onItemClicked(v, adapterPosition) } abstract fun bindData(data: T) init { itemView.setOnClickListener(this) } }
OnRecyclerItemClickListener.class
interface OnRecyclerItemClickListener{ fun onItemClicked(view: View?, position: Int) }