android架构:从activity调用dao方法并将结果传递给childactivity进行过滤
android architecture: call dao method from activity and pass result to child activity for filtering
我是Android开发的新手,我需要一些帮助来解决以下问题。
我有 2 个实体:MuscleGroup 和 Practice; MuscleGroup 可以有多种训练练习。在第一个 Activity 中,我在回收视图中显示所有肌肉群。当我点击一个组时,onClick 方法应该传递给第二个 activity 组名或数据库 ID,以便仅使用所选组的实践来填充另一个 recyclerview。我不想观察任何更改的列表,因为记录已冻结。
我尝试在 Activity 中使用没有 Livedata 和观察者的 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());
因为我认为您对 db 的查询冻结了您的应用程序。
但是在adapter中你可以直接把id发送给activity而不需要查询,因为你可以设置视图填充时的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 class。
我是Android开发的新手,我需要一些帮助来解决以下问题。 我有 2 个实体:MuscleGroup 和 Practice; MuscleGroup 可以有多种训练练习。在第一个 Activity 中,我在回收视图中显示所有肌肉群。当我点击一个组时,onClick 方法应该传递给第二个 activity 组名或数据库 ID,以便仅使用所选组的实践来填充另一个 recyclerview。我不想观察任何更改的列表,因为记录已冻结。
我尝试在 Activity 中使用没有 Livedata 和观察者的 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());
因为我认为您对 db 的查询冻结了您的应用程序。
但是在adapter中你可以直接把id发送给activity而不需要查询,因为你可以设置视图填充时的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 class。