'Kotling :: Android :: java.lang.ClassCastException: java.lang.Class cannot be cast to androidx.lifecycle.ViewModel

I am getting an exception in the first line of the code below

viewModel.homeLiveData.observe(this, Observer { list ->

        list?.let {
            mList.addAll(list)
            adapter.notifyDataSetChanged()
        }
    })

java.lang.ClassCastException: java.lang.Class cannot be cast to androidx.lifecycle.ViewModel

The Whole code is Below

what is wrong with the cast ? is there anything wrong of I am creating my ViewModel?

My BaseActivity

  abstract class BaseActivity<V : ViewModel> : DaggerAppCompatActivity(), HasSupportFragmentInjector {

    @Inject
    lateinit var fragmentAndroidInjector: DispatchingAndroidInjector<Fragment>

    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory

    @LayoutRes
    abstract fun layoutRes(): Int

    protected lateinit var viewModel : V

    protected abstract fun getViewModel() : Class<V>

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        val id = item.itemId
        if (id == android.R.id.home)
            onBackPressed()

        return super.onOptionsItemSelected(item)
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        setContentView(layoutRes())
        viewModel = ViewModelProviders.of(this, viewModelFactory).get(getViewModel())
    }

    override fun supportFragmentInjector(): AndroidInjector<Fragment> = fragmentAndroidInjector
}

then My Activity

class MainActivity : BaseActivity<MainViewModel>() {


override fun layoutRes(): Int = R.layout.activity_main

override fun getViewModel(): Class<MainViewModel> = MainViewModel::class.java

private val mList = mutableListOf<Any>()

private lateinit var adapter: DataAdapter

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

   // setSupportActionBar(toolbar)

    recyclerView.apply {
        layoutManager = GridLayoutManager(applicationContext, 2)
        adapter = DataAdapter(context, mList)

    }

    viewModel.homeLiveData.observe(this, Observer { list ->

        list?.let {
            mList.addAll(list)
            adapter.notifyDataSetChanged()
        }
    })

    viewModel.getHomeItems()


}

and this is my ViewModel

class MainViewModel @Inject constructor() : ViewModel() {


val homeLiveData: MutableLiveData<List<HomeScreenModel>> = MutableLiveData()


fun getHomeItems() {

    Handler().post {

        val homeModleList = listOf(
            HomeScreenModel(R.drawable.ic_launcher_background, MyApplication.instance.getString(R.string.settings))
        )

        homeLiveData.setValue(homeModleList)
    }
}

}



Solution 1:[1]

In my opinion, your viewModel property, which you try to access in viewModel.homeLiveData is shadowed by getViewModel() abstract function that you declare in BaseActivity. This is because Kotlin thinks that getXyZ() is a getter for the field xyZ and thus when you access viewModel, the compiler thinks you want to call getViewModel, which is of type Class<V>. I suggest renaming either the function or the property and it should work then.

Solution 2:[2]

Check your viewModel factory if you implemented it correctly

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Maroš Šeleng
Solution 2 Efanious