首页 > 解决方案 > 带有 Switch Cases 的 Android ViewModel 不起作用?

问题描述

准确地说,它正在工作,但 ViewModel 正在触发所有案例而不是选定案例。

如果我将值 enablethis 设置为“one”或其他值,则不会对其产生任何影响。理想情况下,如果我将 enablethis 设置为这些 [one,two,..] 中的任何一个,它应该只启用那种情况,并且只在这种情况下将按下的值设置为“true”。但这并没有发生。

我发现所有观察者都在观察值的任何变化,即使它们在开关盒内并导致按下=真。我怎样才能避免这种情况。

switch (enablethis) {
    case "four":
        messageViewModel.getMessageOne().observe((LifecycleOwner) ctx, new Observer<Integer>() {
            @Override
            public void onChanged(@Nullable Integer integer) {
                if (integer > 0)  pressed = true;
                Log.d("message one","one : "+integer);
            }
        });
        break;
    case "two":
        messageViewModel.getMessageTwo().observe((LifecycleOwner) ctx, new Observer<Integer>() {
            @Override
            public void onChanged(@Nullable Integer integer) {
                if (integer > 0)  pressed = true;
                Log.d("message two","two : "+integer);
            }
        });
        break;
    case "two":
        messageViewModel.getMessageThree().observe((LifecycleOwner) ctx, new Observer<Integer>() {
            @Override
            public void onChanged(@Nullable Integer integer) {
                if (integer > 0)  pressed = true;
                Log.d("message three","three : "+integer);
            }
        });
        break;
    case "three":
        messageViewModel.getMessageFour().observe((LifecycleOwner) ctx, new Observer<Integer>() {
            @Override
            public void onChanged(@Nullable Integer integer) {
                if (integer > 0)  pressed = true;
                Log.d("message four","four : "+integer);
            }
        });
        break;
    case "four":
        messageViewModel.getMessageFive().observe((LifecycleOwner) ctx, new Observer<Integer>() {
            @Override
            public void onChanged(@Nullable Integer integer) {
                if (integer > 0)  pressed = true;
                Log.d("message five","five : "+integer);
            }
        });
        break; 
}

我也尝试过这样做,但这也不起作用-

messageViewModel.getMessageFive().observe((LifecycleOwner) ctx, new Observer<Integer>() {
            @Override
            public void onChanged(@Nullable Integer integer) {
                if (integer > 0 && enablethis.equals("five")) pressed = true;
            }
        });

由@JeelVankhede建议和更新的解决方案仍然无法正常工作-**

    messageViewModel.getMessageFive().observe((LifecycleOwner) ctx, new Observer<Integer>() {
        @Override
        public void onChanged(@Nullable Integer integer) {
            if (integer > 0) pressed = true;
        }
    });
 messageViewModel.getMessageOne().removeObserver(this);
 messageViewModel.getMessageTwo().removeObserver(this);
 messageViewModel.getMessageThree().removeObserver(this);
 messageViewModel.getMessageFour().removeObserver(this);
 // messageViewModel.getMessageFive().removeObserver(this);

标签: androidswitch-statementviewmodelandroid-databindingandroid-livedata

解决方案


推荐阅读