In the context of MVVM, is this an efficient way to communicate to the view that I should display some TextViews? Any advice on how I can improve it?

ViewModel code:

private var _shouldDisplayDischargeCurrent = MutableLiveData<Boolean>()
    val shouldDisplayDischargeCurrent: LiveData<Boolean>
        get() = _shouldDisplayDischargeCurrent

Activity code:

viewModel.shouldDisplayDischargeCurrent.observe(this, Observer { shouldDisplay ->
            if (!shouldDisplay) {
                binding.textviewDischargeCurrentTitle.visibility = GONE
                binding.textviewDischargeCurrent.visibility = GONE
                binding.textviewDischargeTimeTitle.visibility = GONE
                binding.textviewDischargeTime.visibility = GONE
  • \$\begingroup\$ Do you also want to show the view? currently, your code will only hide it \$\endgroup\$ Commented Sep 2, 2022 at 8:35

1 Answer 1


Will asume you are using ConstraintLayout and also want to show the views (currently your code only hides the views) so I think it can be improved in 2 ways.

The first way is to use View.isVisible extension from google's lib instead of setting GONE. So you code will become like this:

viewModel.shouldDisplayDischargeCurrent.observe(this, Observer { shouldDisplay ->
    binding.textviewDischargeCurrentTitle.isVisible = !shouldDisplay
    binding.textviewDischargeCurrent.isVisible = !shouldDisplay
    binding.textviewDischargeTimeTitle.isVisible = !shouldDisplay
    binding.textviewDischargeTime.isVisible = !shouldDisplay

and the second way is to use Constraint Group. Add a new element in XML with all the view's ids you want to hide:

    app:constraint_referenced_ids="textviewDischargeCurrent, textviewDischargeCurrentTitle,textviewDischargeTime,textviewDischargeTimeTitle"

and then in your code:

viewModel.shouldDisplayDischargeCurrent.observe(this, Observer { shouldDisplay ->
// those are no longer needed
//    binding.textviewDischargeCurrentTitle.isVisible = !shouldDisplay
//    binding.textviewDischargeCurrent.isVisible = !shouldDisplay
//    binding.textviewDischargeTimeTitle.isVisible = !shouldDisplay
//    binding.textviewDischargeTime.isVisible = !shouldDisplay
    binding.textviewGroup.isVisible = !shouldDisplay

Also Observer { can be removed so the final result with Constraint Group will be:

viewModel.shouldDisplayDischargeCurrent.observe(this) { shouldDisplay ->
    binding.textviewGroup.isVisible = !shouldDisplay

Regarding performance I could not find much about this. Maybe someone else can comment about it. Personaly I would go with Constraint Group and View.isVisible


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.