简体   繁体   English

当我在 Android Studio 中使用数据绑定时,我会收到什么错误 Smart cast to 'HomeViewModel' is possible?

[英]What do I get the error Smart cast to 'HomeViewModel' is impossible when I use data binding in Android Studio?

I binding HomeViewModel to layout.xml using <variable name="aHomeViewModel"type="info.dodata.voicerecorder.viewcontrol.HomeViewModel" />我使用<variable name="aHomeViewModel"type="info.dodata.voicerecorder.viewcontrol.HomeViewModel" />HomeViewModel绑定到 layout.xml

I get the following error when I run the code.运行代码时出现以下错误。

Smart cast to 'HomeViewModel' is impossible, because 'binding.aHomeViewModel' is a mutable property that could have been changed by this time智能转换为 'HomeViewModel' 是不可能的,因为 'binding.aHomeViewModel' 是一个可变属性,此时可能已更改

I think that binding.aHomeViewModel.delete(binding.amVoice) cause the error, how can I fix it?我认为binding.aHomeViewModel.delete(binding.amVoice)导致错误,我该如何解决?

VoiceAdapters.kt语音适配器.kt

class VoiceAdapters (private val aHomeViewModel: HomeViewModel):
        ListAdapter<MVoice, VoiceAdapters.VoiceViewHolder>(MVoiceDiffCallback()) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VoiceViewHolder {
        return VoiceViewHolder(
            LayoutVoiceItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        )
    }

    override fun onBindViewHolder(holder: VoiceViewHolder, position: Int) {
        val aMVoice = getItem(position)
        holder.bind(aHomeViewModel, aMVoice)
    }

    class VoiceViewHolder (private val binding: LayoutVoiceItemBinding):
          RecyclerView.ViewHolder(binding.root) {

        init {
            setControl()
        }

        private fun navigateToDetail( view: View,  aMVoice: MVoice )
        {
            val direction = FragmentHomeDirections.actionHome2Detail(aMVoice)
            view.findNavController().navigate(direction)
        }

        fun bind(aHomeViewModel: HomeViewModel, aMVoice: MVoice){
            binding.amVoice=aMVoice
            binding.aHomeViewModel=aHomeViewModel
            binding.executePendingBindings()
        }

        fun setControl(){              
            binding.btnDelete.setOnClickListener {
                binding.amVoice?.let {
                  binding.aHomeViewModel?.let {
                     binding.aHomeViewModel.delete(binding.amVoice)  //I think it cause error.
                  }
              }
            }
        }
    }

}


class MVoiceDiffCallback : DiffUtil.ItemCallback<MVoice>() {
   ...
}

HomeViewModel.kt HomeViewModel.kt

class HomeViewModel(private val mDBVoiceRepository: DBVoiceRepository) : ViewModel() {
    ...
    
    fun delete(aMVoice: MVoice){
        viewModelScope.launch {
            mDBVoiceRepository.deleteVoice(aMVoice)
        }
    }

}

layout.xml布局文件

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<data>
    <variable name="aMVoice"
        type="info.dodata.voicerecorder.model.MVoice"  />

    <variable name="aHomeViewModel"
        type="info.dodata.voicerecorder.viewcontrol.HomeViewModel" />
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:orientation="horizontal">

    <TextView
       android:id="@+id/voiceID"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@{Integer.toString(aMVoice.id)}" />

    <TextView
        android:id="@+id/title_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50dp"
        android:text="@{aMVoice.name}" />
    ...
</LinearLayout>

</layout>

Added Content添加的内容

If I use Code A, I will get the new compile warning information Warning A.如果我使用代码 A,我会得到新的编译警告信息警告 A。

Code A代码 A

binding.btnDelete.setOnClickListener {
    binding.aHomeViewModel!!.delete(binding.amVoice!!)
}

Warning A警告 A

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.此版本中使用了已弃用的 Gradle 功能,使其与 Gradle 7.0 不兼容。 Use '--warning-mode all' to show the individual deprecation warnings.使用“--warning-mode all”来显示单个弃用警告。

HomeViewModel is a mutable property that could have been changed by this time. HomeViewModel是一个可变属性,此时可能已更改。 It's require to use safe call with !!需要使用安全调用!! or ?或者? operator操作员

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 尝试使用SherlockListFragment时,为什么会出现“无法转换为android.app.Fragment”错误 - why do I get “cannot be cast to android.app.Fragment” error when trying to use SherlockListFragment 键入data.getExtras()时出现错误,我正在遵循Android教程在Android Studio中制作相机应用程序,该怎么办? - I'm following an Android tutorial to make camera app in Android Studio when I type data.getExtras() its giving an error, what should I do? 智能施法是不可能的 - Smart cast is impossible android get当我使用presenter进行绑定时,仅允许一个布局元素和一个数据元素错误 - android get Only one layout element and one data element are allowed error when i using presenter for binding 当我使用android studio时,出现与HAXM相关的错误 - When I use android studio, i got error related with HAXM 我在 android studio 中遇到数据绑定问题 - i have a problem with data binding in android studio 智能合并在Android Studio中有什么作用? - What does smart merge do in Android Studio? 当我要开始我的AVD时,我从Android Studio获得了以下屏幕,要克服此问题,我要怎么办? - when i'm going to start my AVD i get the following Screen from Android studio, To overcome this issue what i gonna do? 当我添加第三方依赖时,我无法解决android studio中的错误,该怎么办才能解决此问题? - When I add 3rd party dependencies I get failed to resolve errors in android studio, what should I do to fix this? 当我设置背景图像时,为什么在 android studio 中会出现此错误 - Why do i get this error in android studio when i set a background image
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM