android - 将数据从另一个活动发送到一个活动的片段?
问题描述
我有 MainActivity,其中包含带有选项卡的 TabLayout:每个选项卡都是一个片段,每个选项卡都有一个 RecyclerView。当我在主活动中点击 FAB 时,会打开 NewReminderActivity。
我使用架构组件:Entity(Reminder)、DAO、Room、ViewModel、LiveData 和 Repository。
问题是:
- 我应该使用哪些方法将新创建的提醒项传递到片段中(其中包含如上所述的 RecyclerView?
我有一些想法,但请你帮我,给我一个正确的实施方向:
1)我想,我应该将数据传递到 MainActivity,然后从 MainActivity 传递到片段并使用https://developer.android.com/topic/libraries/architecture/viewmodel.html#sharing中提到的 ViewModel ,对吗?
2) 我想我应该在 NewReminderActivity 中使用 setResult(),对吗?
解决方案
如果您正在使用 Room,则没有理由使用setResult
将新项目转移到任何这些以前的 Fragment/Activity,因为 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 都将使用新项目更新(如果它们是结果的一部分,因为条件匹配它)。
推荐阅读
- python-3.x - 在 tkinter 窗口中嵌入另一个应用程序
- javascript - 你如何清理字符串以传递正则表达式?
- flutter - Flutter Web:像 YouTube 一样全屏播放视频
- css - CSS:为什么忽略 Flex 间隙?
- javascript - 如何将几个base64数据添加到输入中 - js
- java - OWASP 依赖检查,如何使用抑制
- .net - 在 Visual Studio 2022 中发布应用程序失败
- javascript - 异步条形码图像加载到画布中并在使用 quagga 处理后
- swift - SwiftUI ForEach 文本填充在元素下方添加了额外的间距
- android - Exoplayer 无法在诺基亚 G10 中播放视频