【问题标题】:Send data to one activity's fragment from another activity?将数据从另一个活动发送到一个活动的片段?
【发布时间】:2019-03-08 16:16:34
【问题描述】:

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

我使用架构组件:Entity(Reminder)、DAO、Room、ViewModel、LiveData 和 Repository。

问题是:

  • 我应该使用哪些方法将新创建的提醒项传递到片段中(其中包含如上所述的 RecyclerView?

我有一些想法,但请你帮我,给我一个正确的实施方向:

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

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

【问题讨论】:

  • 我认为更简洁的方法是首先将数据从 NewReminderActivityViewModel 更新到您的 Room 数据库。同时订阅 MainActivity 的 Fragments 以监听 Room 数据库中的更改,然后自动更新您的 RecyclerView 。 MainActivity MainActivityViewModel Room Database NewReminderActivity NewReminderActivityViewModel RoomDatabase 很高兴进一步讨论这个问题

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


【解决方案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);
            }
        });
    }
}

在这种情况下,您在第二个 Activity 中需要做的就是插入新项目,然后完成:

// imagine this is on background thread
myDao.insertItem(item);
runOnUiThread(() -> {
    finish();
});

并且您的所有 RecyclerViews 都将使用新项目更新(如果它们是结果的一部分,因为条件匹配它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2019-07-31
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多