0

im new to kotlin android development and trying to build a messenger follow the youtube tutorial by lets build that apps (https://www.youtube.com/watch?v=SuRiwVF5bzs&list=PL0dzCUj1L5JE-jiBHjxlmXEkQkum_M3R-&index=4 >from 19:33) i founded i the GroupieViewHolder is not working, i spent 4 hour of time but still not able to find the arror.\

Below is what i have tried.

This is my project level gradle.file `

buildscript {
    ext.kotlin_version = '1.6.21'

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.google.gms:google-services:4.3.14'

        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

plugins {
    id 'com.android.application' version '7.2.1' apply false
    id 'com.android.library' version '7.2.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.10' apply false

}


task clean(type: Delete) {
    delete rootProject.buildDir
}

This is my app level gradle.file

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'com.google.gms.google-services'
    id 'kotlin-android-extensions'
}

apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
    compileSdk 32

    androidExtensions {
        experimental = true
    }

    defaultConfig {
        applicationId "com.example.assignment"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    buildFeatures {
        viewBinding true
    }


    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }


}

dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.5.1'
    implementation 'com.google.android.material:material:1.6.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'com.google.firebase:firebase-auth-ktx:21.1.0'

    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

    implementation platform('com.google.firebase:firebase-bom:31.0.1')
    implementation 'com.google.firebase:firebase-analytics-ktx'
    implementation 'com.google.firebase:firebase-storage-ktx'
    implementation 'com.google.firebase:firebase-database-ktx'

    implementation 'de.hdodenhof:circleimageview:3.1.0'

    //Progress dialog library
    implementation 'com.jpardogo.googleprogressbar:library:1.2.0'

    //TODO https://github.com/lisawray/groupie  cannnot add groupie into gradle.
    //implementation "com.github.lisawray.groupie:groupie:$groupie_version"
    implementation "com.github.lisawray.groupie:groupie:2.10.0"
    implementation 'com.github.lisawray.groupie:groupie-kotlin-android-extensions:2.10.0'

    implementation 'com.squareup.picasso:picasso:2.71828'
}

This is settings:gradle

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }  
       jcenter() 
    }
}
rootProject.name = "Assignment"
include ':app'

This is the activity file (NewMessageActivity.kt)

package com.example.assignment

import android.content.ClipData
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.renderscript.Sampler
import android.util.Log
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import com.squareup.picasso.Picasso
import com.xwray.groupie.GroupieAdapter
import kotlinx.android.synthetic.main.activity_new_message.*

import com.xwray.groupie.kotlinandroidextensions.Item
import com.xwray.groupie.kotlinandroidextensions.GroupieViewHolder
import kotlinx.android.synthetic.main.song.*  //THIS CANNOT BE IMPORTED
import kotlinx.android.synthetic.main.my_item_layout.* //THIS CANNOT BE IMPORTED
import kotlinx.android.synthetic.main.user_row_new_message.view.*

class NewMessageActivity : AppCompatActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_new_message)

        supportActionBar?.title="Select User"

        fetchUsers()
    }

    private fun fetchUsers() {
        val ref = FirebaseDatabase.getInstance().getReference("/Users")
        ref.addListenerForSingleValueEvent(object: ValueEventListener {
            override fun onDataChange(p0: DataSnapshot) {
                val adapter = GroupieAdapter<GroupieViewHolder>() //HERE IS THE ERROR

                p0.children.forEach {
                    Log.d("NewMessage", it.toString())
                    val user = it.getValue(User::class.java)
                    if(user != null) {
                        adapter.add(UserItem(user))
                    }

                }
                recyclerview_newmessage.adapter=adapter
            }

            override fun onCancelled(p0: DatabaseError) {
                TODO("Not yet implemented")
            }
        }
    }
}
class UserItem(val user: User): Item<GroupieViewHolder>() { //HERE IS THE ERROR
    override fun bind(viewHolder: GroupieViewHolder, position: Int) {
        viewHolder.itemView.username_textview_new_message.text = user.username
        Picasso.get().load(user.profileImageUrl).into(viewHolder.itemView.imageview_new_message)
    }

    override fun getLayout(): Int {
        return R.layout.user_row_new_message
    }
}

Below is the error shown when i mouse hover to GroupieViewHolder

Here is the error when my mouse hover to GroupieViewHolder

mkk
  • 1
  • 1
  • I edited your question as it seems more of a semantic issue than a Firebase one. The issue is about [generics](https://kotlinlang.org/docs/generics.html), the GroupieAdapter doesn't have any generic parameter on it that's why your'e getting that compile error – z.g.y Nov 12 '22 at 06:00

1 Answers1

0

Follow the below steps,

  1. kotlin-android-extension is Deprecated. use ViewBinding or DataBinding inorder to work properly.

    //remove deprecated 
     implementation 'com.github.lisawray.groupie:groupie-kotlin-android-extensions:2.10.0'
    
    //for viewbinding ,replace with
    implementation "com.github.lisawray.groupie:groupie-viewbinding:2.10.0"
    
  2. update Groupie Library to latest version(2.10.1) which added support for kotlin version 1.6 (check more about here.).

Once you added, it will like below. enter image description here

  1. Enable ViewBinding or Databinding in App Level Gradle File inside android tag.

viewBinding{ enabled = true }

enter image description here

  1. if you not aware on viewBinding, please learn that (which is pretty simple to understand.)

  2. now you have to change the UserItem into below in NewMessageActivity.kt,

    //item with viewBinding.
     class UserItem(val user: User): BindableItem<UserRowNewMessageBinding>() {
    
     // Other implementations...
     override fun bind(viewBinding: UserRowNewMessageBinding, position: Int) {
         viewBinding.usernameTextviewNewMessage.text = user.username
         Picasso.get()
                .load(user.profileImageUrl)
                .into(viewBinding.imageviewNewMessage)
     }
    
     override fun getLayout(): Int = R.layout.user_row_new_message
    
     override fun initializeViewBinding(view: View): UserRowNewMessageBinding {
         return UserRowNewMessageBinding.bind(view)
     }
     }
    
  • UserRowNewMessageBinding - Your item layout binding id.
  • viewBinding.usernameTextviewNewMessage - Your item TextView binding id.
  • viewBinding.imageviewNewMessage - Your item ImageView binding id.
  1. Change the initialization of GroupieAdapter inside fetchUser() in newMessageActivity.kt. like below

    val adapter = GroupieAdapter() //remove the Generic Type here. which is no longer need.
    

DON'T FORGET TO SYNC,REBUILD ONCE YOU CHANGE ANYTHING IN GRADLE FILES.

TIP, If you are new to Android Development, always get learn from some latest version of videos,blogs or atleast less 2 years old videos/blogs.

Dev007
  • 222
  • 2
  • 9