android Liveata Observer не уведомлен - PullRequest
0 голосов
/ 29 января 2020

Привет, ребята, это мой первый выстрел в liveata, и я буду благодарен, если вы поможете мне найти, что не так с этим Обозревателем

В разделе Обозреватель в моей MainActivity ничего не может получить, все в порядке от моего Dialogfragment и класс MainModel для MainViewModel, и у меня есть запущенные журналы, но ничего не происходит с Observer в 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")
    }
}



Ответы [ 2 ]

2 голосов
/ 29 января 2020

MainModel.mainViewModel и MainActivity.mainViewModel - разные экземпляры.

Вы не должны использовать ViewModel, как это

private val mainViewModel = MainViewModel()
1 голос
/ 29 января 2020

Вы меняете ссылку LiveData в MainViewModel в этой строке:

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 и не изменять его после создания. И просто обновите значение.

...