0

大家好,这是我第一次接触 livedata,如果你能帮我找出这个观察者的问题,我将不胜感激

我的 MainActivity 中的观察者部分无法接收任何东西,从我的 Dialogfragment 和 MainModel 类到 MainViewModel 一切都很好,我已经触发了日志,但 MainActivity 中的观察者没有任何反应

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")
    }
}
4

2 回答 2

2

MainModel.mainViewModel并且MainActivity.mainViewModel是不同的实例。

你不应该像这样使用 ViewModel

private val mainViewModel = MainViewModel()
于 2020-01-29T08:39:33.550 回答
1

您正在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 不可变,一旦创建就不要更改它。只需更新值。

于 2020-01-29T09:27:03.370 回答