gpt4 book ai didi

android - 通过Kotlin使用Intent Extras获取房间数据

转载 作者:行者123 更新时间:2023-12-02 13:26:50 26 4
gpt4 key购买 nike

我是Couroutines,viewmodels和Room的新手。我正在构建一个包含2个 Activity 的应用程序,分别存储Hymns,HmnnList和HymnContent Activity 。

  • 第一个 Activity 在卡片 View 上显示的recyclerview数据上显示数据(hymn_title,hymn_number和hymn_language。
  • 第二个 Activity 应该显示从卡片 View 中选择的项目的内容(hymn_text)。

  • 看起来像这样:
    enter image description here
    我对如何传递意图附加功能有些困惑。我已经在Adapter上实现了一个侦听器,以传递所选项目的位置,但是我需要一些帮助,以帮助您从Second Activity的Room中获取确切的项目。
    这是我的意图:
    enter image description here
    这是 View 模型
        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)
    }
    }
    道在这里:
        @Dao
    interface HymnDatabaseDao {
    @Query ("SELECT * FROM data")
    fun getAllHymns():LiveData<List<Data>>

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insert(hymn: Data)

    @Query("DELETE FROM data")
    suspend fun deleteAll()
    }
    这是应该显示内容的 Activity (第二个 Activity )
        class HymnContentActivity : AppCompatActivity() {
    private var hymnPosition = POSITION_NOT_SET
    private lateinit var hymnViewModel: HymnViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_hymn_content)

    hymnPosition = intent.getIntExtra(EXTRA_HYMN_POSITION, POSITION_NOT_SET)
    if(hymnPosition!= POSITION_NOT_SET) {
    displayHymn()
    }

    }

    private fun displayHymn(){
    //get hymn corresponding to position
    //val hymnText: TextView = findViewById(R.id.hymn_display_text_view)
    Toast.makeText(this, "Hello World", Toast.LENGTH_LONG).show()

    }
    }
    存储库在此处(在提出第一个答案后包括在内):

    class HymnRepository(private val hymnDatabaseDao: HymnDatabaseDao) {

    val allhymns: LiveData<List<Data>> = hymnDatabaseDao.getAllHymns()
    suspend fun insert(data: Data){
    insert(data)
    }
    suspend fun getHymnById(hymnId:Int):Data{
    return getHymnById(hymnId)
    }
    }

    如果某些专业人士能提供帮助,我将感到高兴。
    问候!

    最佳答案

  • 代替赞美诗位置使用赞美诗编号,或者由Data返回的HymnDatabaseDao类的主键是什么。将所选赞美诗的主键传递给额外内容;
  • 在您的DAO界面(和存储库)中添加新功能,以通过其主键获得一个赞美诗;
  • 在您的 View 模型中添加新的getHymnById方法;
  • 在接收器 Activity 中,通过给定的主键查询特定的赞美诗。

  • 第一步。使用赞美诗编号/ 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
    }
    第三步:使用用于提取单个赞美诗的新方法更新 View 模型。
    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
    }
    }

    关于android - 通过Kotlin使用Intent Extras获取房间数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63533668/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com