java - 安卓架构: call dao method from activity and pass result to child activity for filtering

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

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

我尝试在没有 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);
    }
}

child Activity :

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);});
}

我希望我的描述是清楚的。

最佳答案

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

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

因为我认为您对数据库的查询会卡住您的应用程序。

但是在适配器中,您可以将 id 发送到 Activity 而无需查询,因为您可以在 View 填充时设置 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 项目的包装 View ,链接在VODViewHolder 类中。

关于java - 安卓架构: call dao method from activity and pass result to child activity for filtering,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57761713/

相关文章:

java - 从 HTML div 内的 Servlet 转发页面

android - GCM 额外错误 : "TooManyMessages"

android - 生成 Android 房间迁移的最佳方法是什么?

android - 在 Android 中读取 BLE 接近配置文件的蓝牙 RSSI

android - Firebase 未向手机号码发送 OTP

kotlin - android,使用Room和kotlin,如何在字段上添加唯一约束

具有初始值后的android房间ORM

java - SVN - 以编程方式提交文件 - 错误 svn : E200009: xyz. java 不受版本控制

在 servlet 中加载 XML 文件时,Java Properties 类抛出 NPE?

java - 给定字符集将 InputStream 转换为 Stream<String>