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

У меня есть MainActivity, которая содержит TabLayout с вкладками: каждая вкладка является фрагментом, а каждая имеет RecyclerView. Когда я нажимаю FAB в главном действии, открывается функция NewReminderActivity.

Я использую компоненты архитектуры: сущность (напоминание), DAO, Room, ViewModel, LiveData и репозиторий.

Вопрос:

  • Какие методы я должен использовать, чтобы доставить новый созданный элемент напоминания во фрагмент (который содержит, как упоминалось выше, RecyclerView?

У меня есть несколько идей, но не могли бы вы помочь мне, пожалуйста, и дать мне правильное направление для реализации:

1) Полагаю, мне следует доставить данные в MainActivity, затем из MainActivity во фрагмент и использовать ViewModel, как указано в https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing, я прав?

2) Полагаю, я должен использовать setResult () в NewReminderActivity, я прав?

1 Ответ

0 голосов
/ 11 марта 2019

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

...