将数据发送到另一活动的一个活动的片段?

时间:2019-03-08 16:16:35

标签: android mvvm android-room android-livedata android-viewmodel

我有MainActivity,其中包含带有选项卡的TabLayout:每个选项卡都是一个片段,每个选项卡都有RecyclerView。当我在主活动中点击FAB时,NewReminderActivity被打开。

我使用架构组件:实体(提醒),DAO,Room,ViewModel,LiveData和存储库。

问题是:

  • 我应使用哪种方法将一个新创建的提醒项传递到片段中(该片段包含上面提到的RecyclerView?

我有一些想法,但是能否请您帮我,并给我正确的实施方向:

1)我想,我应该将数据传递给MainActivity,然后从MainActivity传递到片段,并按照https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing中所述使用ViewModel,对吗?

2)我猜应该在NewReminderActivity中使用setResult(),对吗?

1 个答案:

答案 0 :(得分:0)

如果您正在使用Room,则由于Room自动管理无效,因此没有理由使用setResult将新项目转移到这些先前的片段/活动中。

@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都将使用新项进行更新(如果它们是条件匹配的结果的一部分)。