android livedata Observer 没有通知
android livedata Observer didn't notified
大家好,这是我对 livedata 的第一次拍摄,如果你能帮我找出这个 Observer 有什么问题,我将不胜感激
我的 MainActivity 中的 Observer 部分无法接收到任何东西,从我的 Dialogfragment 和 MainModel class 到 MainViewModel 一切正常,我已经触发了日志,但是 MainActivity 中的 Observer 没有任何反应
class MainModel {
private var resultLiveData = MutableLiveData<List<Course>>()
private val courseList = ArrayList<Course>()
private val mainViewModel = MainViewModel()
fun sum(course: Course) {
courseList.add(course)
resultLiveData.value = courseList
Log.d("tag", "$course in model")
mainViewModel.loadedResult(resultLiveData)
Log.d("tag", "${resultLiveData.value} in my model")
}
}
class MainViewModel : ViewModel() {
var result = MutableLiveData<List<Course>>()
fun loadedResult(resultData: MutableLiveData<List<Course>>) {
result = resultData
Log.d("tag", "main viewModel ${result.value}")
Log.d("tag", "main viewModel ${resultData.value}")
}
}
class MainActivity : AppCompatActivity() {
private lateinit var fragmentManager: FragmentManager
private lateinit var linearLayoutManager: LinearLayoutManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
linearLayoutManager = LinearLayoutManager(this)
mainRecyclerView.layoutManager = linearLayoutManager
fragmentManager = supportFragmentManager
setupLivedata()
floatingActionButton.setOnClickListener {
showAddDialog()
}
}
private fun setupLivedata() {
val mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
var myList : ArrayList<Course>
var myObserver = Observer<List<Course>> {
observedList -> myList = observedList as ArrayList<Course>
Log.d("tag", "${myList.size} reached main activity")
Log.d("tag", "${observedList.size} reached main activity")
}
mainViewModel.result.observe(this, myObserver)
}
private fun showAddDialog() {
val inputDialog = InputDialogFragment()
inputDialog.show(supportFragmentManager, "input")
}
}
MainModel.mainViewModel
和 MainActivity.mainViewModel
是不同的实例。
你不应该这样使用 ViewModel
private val mainViewModel = MainViewModel()
您正在更改 MainViewModel
中的 LiveData 参考:
result = resultData
使用 LiveData,您需要 setValue/postvalue
新项目才能真正触发观察者。
像这样:
class MainViewModel : ViewModel() {
val result = MediatorLiveData<List<Course>>()
fun loadedResult(resultData: MutableLiveData<List<Course>>) {
result.addSource(resultData, { resultObj ->
result.setValue(resultObj);
});
Log.d("tag", "main viewModel ${result.value}")
Log.d("tag", "main viewModel ${resultData.value}")
}
}
建议:最好保持 LiveData 不可变,一旦创建就不要更改。并且只更新值。
大家好,这是我对 livedata 的第一次拍摄,如果你能帮我找出这个 Observer 有什么问题,我将不胜感激
我的 MainActivity 中的 Observer 部分无法接收到任何东西,从我的 Dialogfragment 和 MainModel class 到 MainViewModel 一切正常,我已经触发了日志,但是 MainActivity 中的 Observer 没有任何反应
class MainModel {
private var resultLiveData = MutableLiveData<List<Course>>()
private val courseList = ArrayList<Course>()
private val mainViewModel = MainViewModel()
fun sum(course: Course) {
courseList.add(course)
resultLiveData.value = courseList
Log.d("tag", "$course in model")
mainViewModel.loadedResult(resultLiveData)
Log.d("tag", "${resultLiveData.value} in my model")
}
}
class MainViewModel : ViewModel() {
var result = MutableLiveData<List<Course>>()
fun loadedResult(resultData: MutableLiveData<List<Course>>) {
result = resultData
Log.d("tag", "main viewModel ${result.value}")
Log.d("tag", "main viewModel ${resultData.value}")
}
}
class MainActivity : AppCompatActivity() {
private lateinit var fragmentManager: FragmentManager
private lateinit var linearLayoutManager: LinearLayoutManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
linearLayoutManager = LinearLayoutManager(this)
mainRecyclerView.layoutManager = linearLayoutManager
fragmentManager = supportFragmentManager
setupLivedata()
floatingActionButton.setOnClickListener {
showAddDialog()
}
}
private fun setupLivedata() {
val mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
var myList : ArrayList<Course>
var myObserver = Observer<List<Course>> {
observedList -> myList = observedList as ArrayList<Course>
Log.d("tag", "${myList.size} reached main activity")
Log.d("tag", "${observedList.size} reached main activity")
}
mainViewModel.result.observe(this, myObserver)
}
private fun showAddDialog() {
val inputDialog = InputDialogFragment()
inputDialog.show(supportFragmentManager, "input")
}
}
MainModel.mainViewModel
和 MainActivity.mainViewModel
是不同的实例。
你不应该这样使用 ViewModel
private val mainViewModel = MainViewModel()
您正在更改 MainViewModel
中的 LiveData 参考:
result = resultData
使用 LiveData,您需要 setValue/postvalue
新项目才能真正触发观察者。
像这样:
class MainViewModel : ViewModel() {
val result = MediatorLiveData<List<Course>>()
fun loadedResult(resultData: MutableLiveData<List<Course>>) {
result.addSource(resultData, { resultObj ->
result.setValue(resultObj);
});
Log.d("tag", "main viewModel ${result.value}")
Log.d("tag", "main viewModel ${resultData.value}")
}
}
建议:最好保持 LiveData 不可变,一旦创建就不要更改。并且只更新值。