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

如何通过数据绑定在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”。检查标识符的拼写是否正确,并且没有或标记丢失。 我也尝试过直接导入,但仍然不起作用

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

  • 问题内容: 我正在考虑AJAX应用程序必须轮询轮询更新有多大限制,而最理想的是javascript能够建立与服务器的真正双向连接。我想知道是否存在将javascript与可以建立tcp连接的浏览器插件集成的方法,以便可以将数据传入和传出浏览器插件。 问题答案: 这是具有类似方法的实现: 套接字 它使用Java Applet,并将其API桥接到JavaScript,有趣的是… 这里是另一个: 套接字

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