#android #switch-statement #viewmodel #android-databinding #android-livedata
#Android #оператор переключения #viewmodel #android-привязка данных #android-livedata
Вопрос:
Точно, он работает, но ViewModel запускает все обращения вместо выбранного обращения.
Если я установлю для значения enablethis значение «один» или что-то еще, это не окажет на него никакого влияния. В идеале, если я установлю enablethis для любого из этих [один, два, ..], он должен включить только этот регистр и установить значение pressed равным «true» только для этого регистра. Но этого не происходит.
Я понял, что все наблюдатели наблюдают за любым изменением значений, даже если они находятся внутри переключателя, и вызывают нажатие = 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 amp;amp; 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);
Комментарии:
1. Вам нужно будет удалить других наблюдателей в конкретном случае, например
messageViewModel.getMessageFour().removeObservers(this)
.2. @JeelVankhedeThanks спасибо за ваш ответ. Как можно повторно зарегистрировать наблюдателей после удаления. Я спрашиваю об этом, потому что эти значения (переключатели) будут выбираться при использовании приложений несколько раз.
3. Допустим, у вас есть случай «четыре» , в котором вы наблюдаете livedata one , в это время вы можете удалить другие наблюдения (livedata два, три и т.д.), Используя приведенный выше синтаксис, который я предоставил.
4. @JeelVankhede Пожалуйста, проверьте мой обновленный пост. Дайте мне знать две вещи — 1. Правильно ли я удаляю наблюдателей? 2. Как только я использовал все обращения в коммутаторе и вернулся к любому из них, каким-то образом я снова начинаю получать значения от всех наблюдателей.
5. Где вы инициализировали этих наблюдателей? Похоже, что переключатель не нужен, потому что каждый из этих наблюдателей отличается друг от друга, каждый из них будет выдавать значения только при изменении значения из источника. ИМО, если переключатель необходим, он должен быть в том месте, где значение обновляется / изменяется. По какой-либо причине для этих наблюдателей есть переключатель?