我正在用kotlin和存储空间为android制作一个小型任务程序。我将主要活动分为几个片段,然后为每个片段创建一个ViewModel。现在在初始化过程中,我需要程序解析数据库中的所有任务,然后在ListFragment
中创建一些radioButtons。观察者工作得很好,但是List<Task>
变量始终带有空列表...观察者工作得很好,因为Log.i("ListFragment","List is empty!")
确实存在。那是什么问题呢?
以下是一些代码:
class ListFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {
val binding: FragmentListBinding = DataBindingUtil.inflate(
inflater,R.layout.fragment_list,container,false)
val application = requireNotNull(this.activity).application
val dataSource = TaskDatabase.getInstance(application).taskDatabaseDao
val viewModelFactory = ListViewModelFactory(dataSource,application)
val listViewModel =
ViewModelProviders.of(this,viewModelFactory).get(ListViewModel::class.java)
binding.listViewModel = listViewModel
binding.setLifecycleowner(this)
binding.addButton.setOnClicklistener {
findNavController().navigate(R.id.action_listFragment_to_createtaskFragment)
}
listViewModel.tasks.observe(this,Observer {
Log.i("ListFragment","List is empty!")
it?.forEach {
Log.i("ListFragment","tasks exist")
val radioButton = RadioButton(context)
radioButton.text = it.title
radioButton.visibility = View.VISIBLE
radioButton.setOnClicklistener {
Toast.makeText(context,"Working",Toast.LENGTH_SHORT).show()
}
}
})
return binding.root
}
}
class ListViewModel(
val database: TaskDao,application: Application) : AndroidViewModel(application) {
private val viewModelJob = Job()
private val uiScope = Coroutinescope(Dispatchers.Main + viewModelJob)
private val _tasks = MutableLiveData<List<Task>>()
val tasks: LiveData<List<Task>>
get() = _tasks
init {
initializetasks()
}
private fun initializetasks() {
uiScope.launch {
_tasks.value = getTasksFromDatabase()?.value
Log.i("ListViewModel","something")
}
}
private suspend fun getTasksFromDatabase(): LiveData<List<Task>>? {
return withContext(Dispatchers.IO) {
database.getallTasks()
}
}
override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
}
}
谢谢您的帮助!