【问题标题】:Kotling :: Android :: java.lang.ClassCastException: java.lang.Class cannot be cast to androidx.lifecycle.ViewModelKotlin :: Android :: java.lang.ClassCastException: java.lang.Class 无法转换为 androidx.lifecycle.ViewModel
【发布时间】:2019-06-12 16:41:47
【问题描述】:

下面代码的第一行出现异常

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

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

java.lang.ClassCastException:java.lang.Class 无法转换为 androidx.lifecycle.ViewModel

整个代码如下

演员阵容有什么问题?我创建 ViewModel 有什么问题吗?

我的基本活动

  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
}

然后是我的活动

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()


}

这是我的 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)
    }
}

}

【问题讨论】:

  • viewModel 没有问题。问题来自 adapter.notifyDataSetChanged()
  • 您的解决方法是什么?我想我有类似的问题...

标签: android mvvm kotlin dagger-2


【解决方案1】:

在我看来,您尝试在viewModel.homeLiveData 中访问的viewModel 属性被您在BaseActivity 中声明的getViewModel() 抽象函数所遮蔽。这是因为 Kotlin 认为 getXyZ() 是字段 xyZ 的吸气剂,因此当您访问 viewModel 时,编译器认为您要调用 getViewModel,它的类型为 Class&lt;V&gt;。我建议重命名函数或属性,然后它应该可以工作。

【讨论】:

  • 该错误与 viewModel 无关:S 我已从列表中删除 adapter.notifyDataSetChanged()?.let 并且它起作用并且列表已填充。我的适配器有什么问题?我的实例有什么问题吗?
  • 您发布的那个异常肯定与适配器无关。接下来是你永远不会在你的代码中分配lateinit var adapter。您可能得到了UninitializedPropertyException,因为在recyclerView.apply 内部您设置的是rv 的adapter 而不是您的lateinit 属性。
猜你喜欢
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2016-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多