【问题标题】:android architecture: call dao method from activity and pass result to child activity for filteringandroid架构:从activity调用dao方法并将结果传递给子activity进行过滤
【发布时间】:2019-09-02 19:09:17
【问题描述】:

我是 Android 开发新手,我需要一些帮助来解决以下问题。 我有 2 个实体:MuscleGroup 和 Practice; MuscleGroup 可以有多种训练方法。在第一个活动中,我在回收站视图中显示所有肌肉群。当我点击一个组时,onClick 方法应该将组名或数据库 ID 传递给第二个活动,以便仅使用所选组的实践来填充另一个 recyclerview。我不想观察任何更改的列表,因为记录已被冻结。

我尝试在没有 Livedata 和没有观察者的 Activity 中使用 dao 方法,但由于方法不能在 UI 线程中使用而出现错误。

public void showPractices(View view) {
    Intent practiceIntent = new Intent(PracticeGroupActivity.this,
            PracticeActivity.class);
    TextView group = view.findViewById(R.id.musclegroupname);
    Log.i(PracticeGroupActivity.class.getSimpleName(), "group selected: " + group.getText().toString());
    GinnasiumDatabase db = GinnasiumDatabase.getInstance(PracticeGroupActivity.this);
    MuscleGroup found = db.muscleGroupDAO().getMuscleGroupByName(group.getText().toString());
    if(found != null){
        practiceIntent.putExtra("idGroup", found.getId());
        startActivity(practiceIntent);
    }
}

儿童活动:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_practice);

    RecyclerView recyclerView = findViewById(R.id.recyclerpracticeview);
    final PracticeListAdapter adapter = new PracticeListAdapter(this);
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.addItemDecoration(new DividerItemDecoration(this,
            DividerItemDecoration.VERTICAL));

    int idGroup = getIntent().getExtras().getInt("idGroup");
    practiceViewModel = ViewModelProviders.of(this).get(PracticeViewModel.class);
    practiceViewModel.getAllPracticesByGroup(idGroup).observe(this, practices -> { adapter.setPractices(practices);});
}

希望我的描述清楚。

【问题讨论】:

    标签: java android android-room android-architecture-components


    【解决方案1】:

    在您的问题中,我看不到您使用什么来显示 MuscleGroup,但如果是这样,我想是 RecyclerView 用于 ChildActivity 的代码。可以在 MuscleGroup 的 Adapter 中编写 de click 方法,这样就可以避免这行:

    MuscleGroup found = db.muscleGroupDAO().getMuscleGroupByName(group.getText().toString());
    

    因为我认为您对 db 的查询会冻结您的应用程序。

    但在适配器中,您可以将 id 发送到活动而无需查询,因为您可以在视图填充时设置 onclick 方法。

    您可以在 onBindViewHolderMethod 中执行此操作。

    类似这样的:

    @Override
        public void onBindViewHolder(VODViewHolder viewHolder, int i) {
            ...
            final MuscleGroup muscleGroup = muscleGroupList.get(i);
            ...
            viewHolder.wrapper.setOnClickListener(new View.OnClickListener() {
                  Intent practiceIntent = new Intent(PracticeGroupActivity.this, PracticeActivity.class);
                  practiceIntent.putExtra("idGroup", muscleGroup.getId());
                  startActivity(practiceIntent);
            });
    }
    

    假设您有一个名为muscleGroupList 的列表,就像适配器中的数据集一样,还有一个包装器视图,它包装了所有MuscleGroup 项目,链接在VODViewHolder 类中。

    【讨论】:

    • 基本上我遵循了android开发者指南。现在我听从你的建议
    • 终于解决了我的问题。从适配器我开始传递我的参数查询的子活动,然后在子活动中我可以使用 where 子句调用 dao。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多