Отправлять данные во фрагмент одного действия из другого действия?

#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 обновятся с новым элементом (если они являются частью результатов, поскольку условие соответствует ему).