首页 > 解决方案 > 将数据从另一个活动发送到一个活动的片段?

问题描述

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

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

问题是:

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

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

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

标签: androidmvvmandroid-roomandroid-livedataandroid-viewmodel

解决方案


如果您正在使用 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 都将使用新项目更新(如果它们是结果的一部分,因为条件匹配它)。


推荐阅读