我有MainActivity,其中包含带有选项卡的TabLayout:每个选项卡都是一个片段,每个选项卡都有RecyclerView。当我在主活动中点击FAB时,NewReminderActivity被打开。
我使用架构组件:实体(提醒),DAO,Room,ViewModel,LiveData和存储库。
问题是:
我有一些想法,但是能否请您帮我,并给我正确的实施方向:
1)我想,我应该将数据传递给MainActivity,然后从MainActivity传递到片段,并按照https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing中所述使用ViewModel,对吗?
2)我猜应该在NewReminderActivity中使用setResult(),对吗?
答案 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都将使用新项进行更新(如果它们是条件匹配的结果的一部分)。