首页 > 解决方案 > 为什么我的 SharedViewModel 先执行?

问题描述

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_list, container, false)

        val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerView)
        recyclerView.adapter = adapter
        recyclerView.layoutManager = LinearLayoutManager(requireActivity())
        
        noDataTextView = view.findViewById(R.id.no_data_textView)
        noDataImageView = view.findViewById(R.id.no_data_imageView)
        
        mToDoViewModel.getAllData.observe(viewLifecycleOwner, Observer { data ->
            adapter.setData(data)
            mSharedViewModel.checkIfDatabaseEmpty(data)
        })
        
        floatingActionButton = view.findViewById<FloatingActionButton>(R.id.floatingActionButton)
        listLayout = view.findViewById(R.id.listLayout)
        floatingActionButton.setOnClickListener {
            findNavController().navigate(R.id.action_listFragment_to_addFragment)
        }
        //set menu
        setHasOptionsMenu(true)
        
        mSharedViewModel.emptyDatabase.observe(viewLifecycleOwner, Observer { data ->
            showEmptyDatabaseViews(data)
        })

        return view
    }

我有一个可见性系统,如果数据库为空,则显示图像。但是当我运行代码时,首先显示图像然后显示数据然后我对其进行调试并看到mSharedViewModel.emptyDatabase.observe()函数首先运行?这里的主要问题是什么,

ps,我正在使用暂停的乐趣来加载数据

编辑 1:我的默认可见性是不可见的

<ImageView>
.
.
android:visibility="invisible"

这是我的 ShareViewModel 类,它将检查数据库是否为空

class SharedViewModel(application: Application) : AndroidViewModel(application) {

    val emptyDatabase: MutableLiveData<Boolean> = MutableLiveData(true)

    fun checkIfDatabaseEmpty(toDoData: List<ToDoData>){
        emptyDatabase.value=toDoData.isEmpty()
    }

这是我的 ViewModel

class ToDoViewModel(application: Application):AndroidViewModel(application) {

    private val toDoDao= ToDoDatabase.getDatabase(application).ToDoDao()
    private val repository:ToDoRepository

    val getAllData: LiveData<List<ToDoData>>

init {
        repository=ToDoRepository(toDoDao)
        getAllData=repository.getAllData
    }


标签: androidkotlinandroid-fragments

解决方案


您的期望:我有一个可见性系统,如果数据库为空,则显示图像。

根据您的代码:

android:visibility="invisible"

默认可见性invisible没问题,但请检查视图模型代码

val emptyDatabase: MutableLiveData<Boolean> = MutableLiveData(true)

您将值设置为true。因此,当任何observer开始observing更改时,default value将传递给observer,因此从逻辑上讲,您的代码是OK,数据库是empty,图像视图是visible

所以,你应该设置falsedefault value.


推荐阅读