是否可以LiveData在保持观察者不变的情况下更改可观察对象?特别是,我有以下情况。在 Dao (Room) 中,我返回 LiveData 作为方法的结果:
@Dao
public interface DayDao {
@Query("SELECT * FROM day WHERE date LIKE :date")
LiveData<Day> getDay(String date);
}
ViewModel 看起来像这样:
public class DayViewModel extends AndroidViewModel {
private AppDatabase appDatabase;
private LiveData<Day> day;
public DayViewModel(Application application) {
super(application);
appDatabase = App.getDatabase();
}
public LiveData<Day> getDay(String date) {
Log.e(TAG, "getDay");
day = appDatabase.dayDao().getDay(date);
if (day != null && day.getValue() != null) {
Log.e(TAG, "res = " + day.getValue().getDate());
}
return day;
}
...
}
我想从具有以下方法的片段中接收来自 LiveData 的数据:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_day, container, false);
...
model = ViewModelProviders.of(getActivity()).get(DayViewModel.class);
String date = ...;
dayLiveData = model.getDay(date);
dayLiveData.observe(this, day -> {
Log.e(TAG, "onObserve");
// Update the UI.
});
return view;
}
public void updateTitle() {
String date = ...;
dayLiveData = model.getDay(date);
}
该方法updateTitle()是从 Activity 调用的。但是,日志显示它首先被调用 - 当onCreateView方法被调用时 - onObserve(并且 UI 被更新),然后getDay()ViewModel 方法被调用,但日志显示
Log.e(TAG, "getDay");
解决了,并且
Log.e(TAG, "res = " + day.getValue().getDate());
不,虽然给定的数据date肯定应该是(即返回的方法appDatabase.dayDao().getDay(date)只会Day返回结果,但返回的相同方法LiveData<Day>不会返回)。是否仍然可以使用 LiveData 在片段方法中进行这样的 UI 更新updateTitle(),还是不可能?
如果您需要存储和显示日期,并使用它从天数据库中提取和显示数据,那么两个 LiveData 的转换将帮助您https://developer.android.com/topic/libraries/architecture/livedata#transform_livedata 你只是做了那里描述的反模式 - 不要这样做。
你应该有这样的东西 - 而不是 addressInput - date,而不是 postalCode - day。