Home > database >  why my SharedViewModel is Executing first?
why my SharedViewModel is Executing first?

Time:10-18

    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
    }

I have a visibility system going on where if the database is empty then the image is shown. but when I run the code first image shows up then the data shows up then I debugged it and seen that mSharedViewModel.emptyDatabase.observe() function is running first? what is the main issue here,

ps, I am using suspended fun to load the data

Edit 1: my default visibility is invisible

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

this is my ShareViewModel Class Which will check the database empty or not

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

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

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

and this my 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
    }


CodePudding user response:

Your expectation: I have a visibility system going on where if the database is empty then the image is shown.

According to your code:

android:visibility="invisible"

The default visibility is invisible okay but check the view model code

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

You set the value to true. So when any observer start observing the changes, the default value will be passed to the observer, so logically your code is OK, database is empty and image view is visible.

So, you should set false as the default value.

  • Related