当前位置: 首页 > 知识库问答 >
问题:

如何通过数据绑定在viewModel和MainActivity之间进行通信?

贺高杰
2023-03-14

我正在尝试使用数据绑定在Kotlin中实现MVVM arcitecture。代码只是将空白屏幕显示为输出。有人能帮我弄清楚为什么在执行这个程序时没有对服务器的调用吗。

我尝试了这个和类似的链接来解决这个问题。

我的代码如下:

主要活动

class MainActivity : AppCompatActivity() {

private var cvViewModel: CvViewModel? = null
private var model: Model?= null
private var liveData: LiveData<Model>? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val binding : ActivityMainBinding= DataBindingUtil.setContentView(this, R.layout.activity_main)
   // setContentView(R.layout.activity_main)
    cvViewModel= ViewModelProviders.of(this).get(CvViewModel::class.java)
    liveData= cvViewModel.getNewsRepository()
}

}

CvRepository类

private val apiCall: ApiCall=
    RetrofitClient.cteateService(ApiCall::class.java)


fun getCvDetails(): MutableLiveData<Model> {
    val cvData = MutableLiveData<Model>()
    apiCall.getCvData().enqueue(object : Callback<Model> {
        override fun onResponse(call: Call<Model>,
                                response: Response<Model>
        ) {
            if (response.isSuccessful) {
                Log.e("abc", ""+response.body().toString())
                cvData.value = response.body()
            }
        }

        override fun onFailure(call: Call<Model>, t: Throwable) {
            cvData.value = null
        }
    })
    return cvData
}

companion object {

    private var cvRepository: CvRepository ? = null

    val instance: CvRepository
        get() {
            if (cvRepository == null) {
                cvRepository = CvRepository()
            }
            return this.cvRepository as CvRepository
        }
}

}

class CvViewModel: ViewModel(){

private var mutableLiveData: MutableLiveData<Model>? = null
private var cvRepository: CvRepository? = null

fun init() {
    if (mutableLiveData != null) {
        return
    }
    cvRepository = CvRepository.instance
    mutableLiveData = cvRepository!!.getCvDetails()
}

fun getNewsRepository(): LiveData<Model>? {
    return mutableLiveData
}

}

共有1个答案

柳德义
2023-03-14

你的

尝试从ViewModel直接将存储库LiveData传递给活动

fun getNewsRepository(): LiveData<Model>? {
    return CvRepository.instance.getCvDetails()
}

然后观察活动的变化

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

    ...

    liveData= cvViewModel.getNewsRepository()
    liveData?.observe(this, Observer { items ->
         //Do your operation here
    })
}
 类似资料:
  • 我有一个带有“x”个片段的视图寻呼机,第一个是“HomeFragment”:它包含2个下拉列表(微调器) 其他片段(FragmentA、FragmentB、FragmentC等)的UI会根据这些微调器的选定项值进行更改 因此,问题是:如何从“HomeFragmet”中的微调器传递此选定项值以用于其他片段?

  • 当我尝试将数据绑定导入MainActivity时,会出现“未解析引用:数据绑定”错误。 主活动文件: 其中包名是我的包名。包名被识别,只有数据绑定不被识别,因此它显示为红色。 我想正是因为这个,碎片登录绑定 也不被承认。 项目build.gradle文件: 应用程序build.gradle文件: 我已经尝试遵循这个codelabhttps://codelabs.developers.google.

  • 我有以下密封类: 我希望将此从xml传递给视图模型: 然后我在需要将信息传递给click处理程序的视图中使用lambdas: 我得到这个错误: 找不到标识符“pot”。检查标识符的拼写是否正确,并且没有或标记丢失。 我也尝试过直接导入,但仍然不起作用

  • 又如何接收?谁来帮帮我。

  • 问题内容: iframe中的网站 不在同一个域中 ,但是两者都是我的,我想在和父网站之间进行交流。可能吗? 问题答案: 在不同的域中,无法调用方法或直接访问iframe的内容文档。 您必须使用跨文档消息传递。 例如在顶部窗口中: 在iframe中: 如果您要将消息从iframe发布到父窗口

  • 我刚开始使用ReactJS,遇到了一个小问题。 我的应用程序本质上是一个带有过滤器的列表和一个更改布局的按钮。目前我使用三个组件: