Android 与Kotlin一起使用Intent Extras获取房间数据

Android 与Kotlin一起使用Intent Extras获取房间数据,android,kotlin,android-intent,android-room,Android,Kotlin,Android Intent,Android Room,我不熟悉常规、视图模型和房间。我正在构建一个包含2个活动的应用程序,分别存储赞美诗、赞美诗列表和赞美诗内容活动 第一个活动在CardView上显示recyclerview上的数据(赞美诗标题、赞美诗编号和赞美诗语言) 第二个活动应该显示CardView中所选项目的内容(赞美诗文本) 看起来是这样的: 我对如何传递intent extras有点困惑……我已经在适配器上实现了一个侦听器,用于传递所选项目的位置,但我需要一些帮助,以了解如何在第二个活动中从房间中获取确切的项目 我的意图是: 这是视

我不熟悉常规、视图模型和房间。我正在构建一个包含2个活动的应用程序,分别存储赞美诗、赞美诗列表和赞美诗内容活动

  • 第一个活动在CardView上显示recyclerview上的数据(赞美诗标题、赞美诗编号和赞美诗语言)
  • 第二个活动应该显示CardView中所选项目的内容(赞美诗文本)
  • 看起来是这样的:

    我对如何传递intent extras有点困惑……我已经在适配器上实现了一个侦听器,用于传递所选项目的位置,但我需要一些帮助,以了解如何在第二个活动中从房间中获取确切的项目

    我的意图是:

    这是视图模型

        class HymnViewModel(application: Application): AndroidViewModel(application) {
            private val repository:HymnRepository
        
            val allHymns: LiveData<List<Data>>
            init {
                val hymnDao = HymnDatabase.getDatabase(application, viewModelScope).hymnDatabaseDao()
                repository = HymnRepository(hymnDao)
                allHymns =repository.allhymns
            }
        
        
            fun insert(data: Data) = viewModelScope.launch(Dispatchers.IO){
            repository.insert(data)
            }
        }
    
    存储库位于此处(建议第一个答案后包括):

    
    类HymnRepository(私有val Hymndabasedao:Hymndabasedao){
    val-allhyms:LiveData=hymandabasedao.getAllhyms()
    暂停乐趣插入(数据:数据){
    插入(数据)
    }
    suspend-fun-getHymnById(hymnId:Int):数据{
    返回getHymnById(hymnId)
    }
    }
    
    如果有专业人士能帮忙,我会很高兴的。 问候

  • 不要使用赞美诗位置,而是使用赞美诗编号,或者使用您的
    hymnadabasedao
    返回的
    Data
    类的主键。将所选赞美诗的主键传递到extras
  • 在DAO接口(和存储库)中添加新函数,以通过主键获得一首赞美诗
  • 将新的
    getHymnById
    方法添加到视图模型中
  • 在接收方活动中,通过给定的主键查询特定的赞美诗
  • 第一步,使用赞美诗编号/id代替赞美诗位置

    inner class HymnViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        ...
        var hymnId: Int = -1 // -1 will be considered invalid ID
    
        init {
            itemView.setOnClickListener {
                val intent = Intent(it.context, HymnContentActivity::class.java)
                intent.putExtra(EXTRA_HYMN_ID, hymnId)
                it.context.startActivity (intent)
            }
        }
    }
    
    第二步:向DAO接口添加新功能。相应地更新存储库

    @Dao
    interface HymnDatabaseDao {
        ...
        
        @Query ("SELECT * FROM data WHERE hymnId = :hymnIdArgument") //hymnId is column name of the primary key
        suspend fun getHymnById(hymnIdArgument: Int): Data
    }
    
    第三步:使用新方法更新视图模型,新方法用于提取单个赞美诗

    class HymnViewModel(application: Application): AndroidViewModel(application) {
        private val repository: HymnRepository
    
        ...
    
        suspend fun getHymnById(hymnId: Int): Data {
            return repository.getHymnById(hymnId)
        }
    }
    
    第四步:查询特定的赞美诗,并根据需要显示其数据

    class HymnContentActivity : AppCompatActivity() {
        companion object {
            private val INVALID_ID = -1
        }
    
        private var hymnId = INVALID_ID
        private lateinit var hymnViewModel: HymnViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_hymn_content)
    
            hymnId = intent.getIntExtra(EXTRA_HYMN_ID, INVALID_ID)
            if (hymnId != INVALID_ID) {
                getHymn()
            }
        }
    
        private fun getHymn() {
            lifecycleScope.launch(Dispatchers.Default) {
                val hymn = hymnViewModel.getHymnById(hymnId)
                withContext(Dispatchers.Main) {
                    displayHymn(hymn)
                }
            }
        }
    
        private fun displayHymn(hymn: Data){
            val hymnText: TextView = findViewById(R.id.hymn_display_text_view)
            hymnText.text = hymn.hymnContent
        }
    }
    

    非常感谢你,Jenea。这对我很有效。但是,我认为我的存储库中的代码可能有问题?请检查它是否正确。我已经添加了回购代码作为问题的编辑…@ManzuGerald,我熟悉了存储库。无法发现任何问题。
    @Dao
    interface HymnDatabaseDao {
        ...
        
        @Query ("SELECT * FROM data WHERE hymnId = :hymnIdArgument") //hymnId is column name of the primary key
        suspend fun getHymnById(hymnIdArgument: Int): Data
    }
    
    class HymnViewModel(application: Application): AndroidViewModel(application) {
        private val repository: HymnRepository
    
        ...
    
        suspend fun getHymnById(hymnId: Int): Data {
            return repository.getHymnById(hymnId)
        }
    }
    
    class HymnContentActivity : AppCompatActivity() {
        companion object {
            private val INVALID_ID = -1
        }
    
        private var hymnId = INVALID_ID
        private lateinit var hymnViewModel: HymnViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_hymn_content)
    
            hymnId = intent.getIntExtra(EXTRA_HYMN_ID, INVALID_ID)
            if (hymnId != INVALID_ID) {
                getHymn()
            }
        }
    
        private fun getHymn() {
            lifecycleScope.launch(Dispatchers.Default) {
                val hymn = hymnViewModel.getHymnById(hymnId)
                withContext(Dispatchers.Main) {
                    displayHymn(hymn)
                }
            }
        }
    
        private fun displayHymn(hymn: Data){
            val hymnText: TextView = findViewById(R.id.hymn_display_text_view)
            hymnText.text = hymn.hymnContent
        }
    }