无法使用新值更新 LiveData
Can't update LiveData with new value
我正在尝试更新 LiveData 列表,但无法执行。 UI 显示来自数据库的相同值。
因此,在 MainActivity 中有一个函数可以从数据库加载数据并为其设置观察者(如果数据发生变化)。 activity 中有一个带有侦听器的按钮,当我点击该按钮(我放置 getData(); 的位置)时。我希望,当我点击按钮时,它会从数据库中加载新的随机值,但实际上它一直显示相同的值。你能给我一个建议或帮助我如何解决这个死胡同吗?!我认为这是一个微不足道的愚蠢错误(或我的无知)。感谢您的关注。
@OnClick(R.id.button)
void submitButton(View view) {
getData();
}
private void getData(){
User userList = new User();
UserViewModel mUserViewModel;
mUserViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
mUserViewModel.getRandom().observe(this, new Observer<List<User>>() {
@Override
public void onChanged(@Nullable final List<User> user) {
// Update UI
if (user != null) {
User userList = user.get(0);
updateUI(userList);
}
}
});
}
UserDao.kt
@Dao
public interface UserDao {
@Query("SELECT * FROM user ORDER BY RANDOM() LIMIT 1")
fun getRandom(): LiveData<List<User>>
}
UserRepository.java
public class UserRepository {
private UserDao mUserDao;
private LiveData<List<User>> mUser;
public UserRepository(Application application) {
AppDatabase db = AppDatabase.getDatabase(application);
mUserDao = db.userDao();
mUser = mUserDao.getRandom();
}
public LiveData<List<User>> getRandom() {
return mUser;
}
}
UserViewModel
public class UserViewModel extends AndroidViewModel {
private UserRepository mRepository;
private LiveData<List<User>> mUser;
public UserViewModel(Application application){
super(application);
mRepository = new UserRepository(application);
mUser = mRepository.getRandom();
}
public LiveData<List<User>> getRandom() {
return mUser;
}
}
您可能想要使用 MediatorLiveData 而不是直接公开 LiveData 引用。要刷新随机用户,您只需重新查询将更新 Activity 中的值的 DAO。这可以通过如下所述进行一些更改来完成。
Activity:
public class MainActivity extends AppCompatActivity {
private final UserViewModel mUserViewModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Other onCreate code
mUserViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
mUserViewModel.getRandom().observe(this, new Observer<User>() {
@Override
public void onChanged(@Nullable final User user) {
// Update UI
if (user != null) {
updateUI(user);
}
}
});
}
@OnClick(R.id.button)
void submitButton(View view) {
mUserViewModel.refresh();
}
}
道:
@Dao
public interface UserDao {
@Query("SELECT * FROM user ORDER BY RANDOM() LIMIT 1")
fun getRandom(): LiveData<User>
}
存储库:
public class UserRepository {
private final UserDao mUserDao;
public UserRepository(Application application) {
AppDatabase db = AppDatabase.getDatabase(application);
mUserDao = db.userDao();
}
public LiveData<User> getRandom() {
return mUserDao.getRandom();
}
}
视图模型:
public class UserViewModel extends AndroidViewModel {
private final UserRepository mRepository;
private final MediatorLiveData<User> mRandomUserMediator = new MediatorLiveData<>();
public UserViewModel(Application application){
super(application);
mRepository = new UserRepository(application);
mRandomUserMediator.addSource(mRepository.getRandom(), mRandomUserMediator::setValue);
}
public LiveData<User> getRandom() {
return mRandomUserMediator;
}
public void refresh() {
mRepository.getRandom();
}
}
我正在尝试更新 LiveData 列表,但无法执行。 UI 显示来自数据库的相同值。 因此,在 MainActivity 中有一个函数可以从数据库加载数据并为其设置观察者(如果数据发生变化)。 activity 中有一个带有侦听器的按钮,当我点击该按钮(我放置 getData(); 的位置)时。我希望,当我点击按钮时,它会从数据库中加载新的随机值,但实际上它一直显示相同的值。你能给我一个建议或帮助我如何解决这个死胡同吗?!我认为这是一个微不足道的愚蠢错误(或我的无知)。感谢您的关注。
@OnClick(R.id.button)
void submitButton(View view) {
getData();
}
private void getData(){
User userList = new User();
UserViewModel mUserViewModel;
mUserViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
mUserViewModel.getRandom().observe(this, new Observer<List<User>>() {
@Override
public void onChanged(@Nullable final List<User> user) {
// Update UI
if (user != null) {
User userList = user.get(0);
updateUI(userList);
}
}
});
}
UserDao.kt
@Dao
public interface UserDao {
@Query("SELECT * FROM user ORDER BY RANDOM() LIMIT 1")
fun getRandom(): LiveData<List<User>>
}
UserRepository.java
public class UserRepository {
private UserDao mUserDao;
private LiveData<List<User>> mUser;
public UserRepository(Application application) {
AppDatabase db = AppDatabase.getDatabase(application);
mUserDao = db.userDao();
mUser = mUserDao.getRandom();
}
public LiveData<List<User>> getRandom() {
return mUser;
}
}
UserViewModel
public class UserViewModel extends AndroidViewModel {
private UserRepository mRepository;
private LiveData<List<User>> mUser;
public UserViewModel(Application application){
super(application);
mRepository = new UserRepository(application);
mUser = mRepository.getRandom();
}
public LiveData<List<User>> getRandom() {
return mUser;
}
}
您可能想要使用 MediatorLiveData 而不是直接公开 LiveData 引用。要刷新随机用户,您只需重新查询将更新 Activity 中的值的 DAO。这可以通过如下所述进行一些更改来完成。
Activity:
public class MainActivity extends AppCompatActivity {
private final UserViewModel mUserViewModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Other onCreate code
mUserViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
mUserViewModel.getRandom().observe(this, new Observer<User>() {
@Override
public void onChanged(@Nullable final User user) {
// Update UI
if (user != null) {
updateUI(user);
}
}
});
}
@OnClick(R.id.button)
void submitButton(View view) {
mUserViewModel.refresh();
}
}
道:
@Dao
public interface UserDao {
@Query("SELECT * FROM user ORDER BY RANDOM() LIMIT 1")
fun getRandom(): LiveData<User>
}
存储库:
public class UserRepository {
private final UserDao mUserDao;
public UserRepository(Application application) {
AppDatabase db = AppDatabase.getDatabase(application);
mUserDao = db.userDao();
}
public LiveData<User> getRandom() {
return mUserDao.getRandom();
}
}
视图模型:
public class UserViewModel extends AndroidViewModel {
private final UserRepository mRepository;
private final MediatorLiveData<User> mRandomUserMediator = new MediatorLiveData<>();
public UserViewModel(Application application){
super(application);
mRepository = new UserRepository(application);
mRandomUserMediator.addSource(mRepository.getRandom(), mRandomUserMediator::setValue);
}
public LiveData<User> getRandom() {
return mRandomUserMediator;
}
public void refresh() {
mRepository.getRandom();
}
}