#android #mvvm #android-room #android-livedata #android-viewmodel
#Android #mvvm #android-комната #android-livedata #android-viewmodel
Вопрос:
У меня есть MainActivity, который содержит таблицу с вкладками: каждая вкладка является фрагментом, и у каждой есть RecyclerView. Когда я нажимаю FAB в Главном действии, открывается NewReminderActivity.
Я использую компоненты архитектуры: Entity (напоминание), DAO, Room, ViewModel, LiveData и репозиторий.
Вопрос в том:
- Какие методы я должен использовать для доставки нового созданного элемента напоминания во фрагмент (который содержит, как упоминалось выше, RecyclerView?
У меня есть несколько идей, но не могли бы вы мне помочь, пожалуйста, и указать правильное направление для реализации:
1) Я предполагаю, что я должен доставить данные в MainActivity, затем из MainActivity во фрагмент и использовать ViewModel, как указано в https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing , я прав?
2) Я думаю, мне следует использовать SetResult () в NewReminderActivity, я прав?
Комментарии:
1. Я думаю, что более чистым способом было бы сначала обновить данные из NewReminderActivityViewModel в вашу базу данных Room. Также подпишитесь на фрагменты вашего MainActivity, чтобы отслеживать изменения в базе данных Room, которая затем автоматически обновит ваш RecyclerView. MainActivity <-> MainActivityViewModel <-> База данных комнат NewReminderActivity <-> NewReminderActivityViewModel <-> RoomDatabase Был бы рад обсудить это подробнее
Ответ №1:
Если вы используете Room, у вас нет причин использовать setResult
для переноса нового элемента в любой из этих предыдущих фрагментов / действий, потому что Room автоматически управляет признанием недействительным.
@Dao
public interface MyDao {
@Query("SELECT * FROM ITEM")
LiveData<List<Item>> getItemsWithChanges();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertItem(Item item);
}
Затем
public class MyViewModel extends ViewModel {
private final LiveData<List<Item>> items;
public LiveData<List<Item>> getItems() {
return items;
}
public MyViewModel(MyDao myDao) {
items = myDao.getItemsWithChanges();
}
}
Затем
public class MyFragment extends Fragment {
MyViewModel myViewModel;
@Override
protected void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
myViewModel = ViewModelProviders.of(getActivity(), viewModelFactory).get(MyViewModel.class);
myViewModel.getItems().observe(getViewLifecycleOwner(), (items) -> {
if(items != null) {
adapter.submitList(items);
}
});
}
}
В этом случае все, что вам нужно сделать во втором действии, это вставить новый элемент, а затем завершить:
// imagine this is on background thread
myDao.insertItem(item);
runOnUiThread(() -> {
finish();
});
И все ваши RecyclerViews обновятся с новым элементом (если они являются частью результатов, поскольку условие соответствует ему).