我的应用程序中有两个不同的导航图。 第一个有 3 个片段:包含已创建项目列表的片段、我创建新项目的片段和具有第二个导航图的支持片段。 第二个导航图具有底部导航和包含有关已创建项目信息的其他片段。当用户选择已创建项目列表中的一项时,它会激活。 为了存储有关项目的信息,我使用房间数据库。
我真的不明白如何将有关所选项目的数据传递给第二个导航图。
我想用导航图参数传递所选项目,但由于我想传递此数据的片段在另一个导航图中,我认为我不能使用它。 我试图在我的数据库中查询以通过 id 查找项目,但我真的不知道如何在我的代码中实现它。
这是我的道:
@Dao
interface ProjectsDao {
@Insert
suspend fun addProjects(projects: Projects)
@Delete
suspend fun deleteProject(projects: Projects)
@Query("DELETE FROM projects")
suspend fun deleteAllProjects()
@Query("SELECT * FROM projects WHERE projects.id = :id")
fun findProjectById(id: Int): LiveData<Projects>
@Update
suspend fun updateProject(projects: Projects)
@Query("SELECT * FROM projects")
fun readAllProjects(): LiveData<List<Projects>>
}
这是我的视图模型:
class DataViewModel(application:Application): AndroidViewModel(application) {
val readAllProjects: LiveData<List<Projects>>
private val repository: ProjectsRepository
init{
val projectsDao = ProjectsDatabase.getDatabase(application).projectsDao()
repository = ProjectsRepository(projectsDao)
readAllProjects = repository.readAllProjects
}
fun addProjects(projects: Projects){
viewModelScope.launch(Dispatchers.IO) {
repository.addProjects(projects)
}
}
fun updateProject(projects: Projects){
viewModelScope.launch(Dispatchers.IO){
repository.updateProject(projects)
}
}
fun deleteProject(projects: Projects){
viewModelScope.launch(Dispatchers.IO) {
repository.deleteProject(projects)
}
}
fun deleteAllProjects(){
viewModelScope.launch(Dispatchers.IO) {
repository.deleteAllProjects()
}
}
fun findProjectById(id: Int){
viewModelScope.launch(Dispatchers.IO) {
repository.findProjectById(id)
}
}
}
这是我尝试将所选项目的 id 从
MainFragment
通过适配器传递到导航图中的下一个片段 SupportFragment
。但是SupportFragment
只有FragmentContainerView 和底部导航。所以项目数据实际上应该传递给ProjectDetailsFragment
.
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val currentItem = projectsList[position]
holder.binding.projectNameTxt.text = currentItem.pr_name
setListeners(currentItem, holder)
//holder.binding.rawLayout.setOnClickListener {
// val action = MainFragmentDirections.actionMainFragmentToSupportFragment(currentItem)
// holder.itemView.findNavController().navigate(action)
//}
//holder.binding.deleteProjectID.setOnClickListener{
// listener.deleteProject(currentItem)
//}
}
private fun setListeners(currentItem: Projects, holder: MainAdapter.MyViewHolder) {
holder.binding.rawLayout.setOnClickListener {
val intent = Intent(holder.itemView.context, SupportFragment::class.java)
intent.putExtra("id", currentItem.id)
holder.itemView.context.startActivity(intent)
//val action = MainFragmentDirections.actionMainFragmentToSupportFragment(intent)
//holder.itemView.findNavController().navigate(action)
}
holder.binding.deleteProjectID.setOnClickListener{
listener.deleteProject(currentItem)
}
}