lateinit var结果在Kotlin中始终未初始化

z9gpfhce  于 2023-11-21  发布在  Kotlin
关注(0)|答案(1)|浏览(310)

我必须在我的覆盖函数notifyAllIslogic中使用selectAllCheckBox,但是变量selectAllCheckBox显示为未初始化,即使它已经在onCreate方法中初始化了。
问题出在onCreate、lateinit声明和notifyAllIslogy函数中。

  1. package com.example.lslmbeta
  2. import android.annotation.SuppressLint
  3. import android.os.Bundle
  4. import android.util.Log
  5. import android.view.Menu
  6. import android.view.MenuItem
  7. import androidx.appcompat.app.AppCompatActivity
  8. import androidx.core.view.WindowCompat
  9. import androidx.core.view.isVisible
  10. import androidx.lifecycle.lifecycleScope
  11. import androidx.recyclerview.widget.LinearLayoutManager
  12. import androidx.recyclerview.widget.RecyclerView
  13. import com.example.lslmbeta.databinding.ActivityMainBinding
  14. import com.example.lslmbeta.datamanagement.dataReader
  15. import com.example.lslmbeta.recyclerview.ItemAdapter
  16. import com.google.android.material.appbar.MaterialToolbar
  17. import com.google.android.material.checkbox.MaterialCheckBox
  18. import kotlinx.coroutines.launch
  19. import java.text.SimpleDateFormat
  20. class MainActivity : AppCompatActivity(), OnAllIsCheckedListener {
  21. companion object {
  22. var isInSelectionMode: Boolean? = null
  23. }
  24. private val MAIN_ACTIVITY_TAG = "Main Activity"
  25. private lateinit var recyclerView: RecyclerView
  26. private lateinit var closeView: MenuItem
  27. private lateinit var selectView: MenuItem
  28. private lateinit var moreView: MenuItem
  29. private lateinit var itemAdapter: ItemAdapter
  30. private lateinit var selectAllCheckBox: MaterialCheckBox
  31. override fun onCreateOptionsMenu(menu: Menu): Boolean {
  32. menuInflater.inflate(R.menu.top_app_bar, menu)
  33. // Menu Group Selection
  34. closeView = menu.findItem(R.id.menu_item_close)
  35. // Menu Group Non Selection
  36. selectView = menu.findItem(R.id.menu_item_select)
  37. moreView = menu.findItem(R.id.menu_item_more)
  38. enableOrDisableSelection()
  39. return true
  40. }
  41. override fun onOptionsItemSelected(item: MenuItem): Boolean {
  42. return when (item) {
  43. closeView -> {
  44. enableOrDisableSelection()
  45. true
  46. }
  47. selectView -> {
  48. if (::itemAdapter.isInitialized) enableOrDisableSelection()
  49. true
  50. }
  51. moreView -> {
  52. // Gestisci il clic sull'elemento "More" (menu a scomparsa)
  53. true
  54. }
  55. else -> super.onOptionsItemSelected(item)
  56. }
  57. }
  58. //TODO togliere il suppress
  59. @SuppressLint("SimpleDateFormat")
  60. override fun onCreate(savedInstanceState: Bundle?) {
  61. super.onCreate(savedInstanceState)
  62. val binding = ActivityMainBinding.inflate(layoutInflater)
  63. val view = binding.root
  64. setContentView(view)
  65. val topToolBar = binding.topToolBar
  66. setSupportActionBar(topToolBar)
  67. WindowCompat.setDecorFitsSystemWindows(window, false)
  68. val dateString = "19/10/2023"
  69. val dateFormat = SimpleDateFormat("dd/MM/yyyy")
  70. val date = dateFormat.parse(dateString)
  71. recyclerView = binding.homeRecycleView
  72. selectAllCheckBox = binding.selectAllCheckbox
  73. Log.d(MAIN_ACTIVITY_TAG, "Select All Checkbox: ${::selectAllCheckBox.isInitialized}")
  74. selectAllCheckBox.setOnClickListener {
  75. if (selectAllCheckBox.isChecked) {
  76. itemAdapter.checkAll()
  77. } else {
  78. itemAdapter.clearCheckedItems()
  79. }
  80. }
  81. lifecycleScope.launch {
  82. val myDataset = dataReader(this@MainActivity, date)
  83. itemAdapter = ItemAdapter(myDataset)
  84. recyclerView.layoutManager = LinearLayoutManager(this@MainActivity)
  85. recyclerView.adapter = itemAdapter
  86. recyclerView.setHasFixedSize(true)
  87. itemAdapter.setCustomListener(MainActivity())
  88. }
  89. }
  90. override fun notifyAllIsChecked(isAllChecked: Boolean) {
  91. Log.d(MAIN_ACTIVITY_TAG, "Is Ready: ${::selectAllCheckBox.isInitialized}")
  92. if (::selectAllCheckBox.isInitialized) selectAllCheckBox.isChecked = isAllChecked
  93. }
  94. @SuppressLint("NotifyDataSetChanged")
  95. private fun enableOrDisableSelection() {
  96. val topToolBar = findViewById<MaterialToolbar>(R.id.topToolBar)
  97. val checkBox = findViewById<MaterialCheckBox>(R.id.select_all_checkbox)
  98. if (isInSelectionMode == null) {
  99. isInSelectionMode = false
  100. Log.w("Enable Or Disable Selection", "Is NULL")
  101. } else {
  102. isInSelectionMode = !isInSelectionMode!!
  103. }
  104. Log.d("Enable Or Disable Selection", isInSelectionMode.toString())
  105. // Group Selection
  106. closeView.isVisible = isInSelectionMode!!
  107. checkBox.isVisible = isInSelectionMode!!
  108. // Group Non Selection
  109. selectView.isVisible = !isInSelectionMode!!
  110. moreView.isVisible = !isInSelectionMode!!
  111. topToolBar.title = if (isInSelectionMode!!) "" else getString(R.string.app_name)
  112. if (isInSelectionMode!!) {
  113. itemAdapter.clearCheckedItems()
  114. } else {
  115. recyclerView.adapter?.notifyDataSetChanged()
  116. }
  117. }
  118. }

字符串
我使用了logs,注意到它在notifyAllIslogs方法调用之前被初始化。

  1. 2023-10-29 11:56:16.938 24963-24963 Main Activity com.example.lslmbeta D Select All Checkbox: true
  2. 2023-10-29 12:09:12.864 24963-24963 Main Activity com.example.lslmbeta D Is Ready: false

gcmastyq

gcmastyq1#

我认为问题就在这里:

  1. itemAdapter.setCustomListener(MainActivity())

字符串
我们不应该手动示例化Activity。作为侦听器传递的Activity未初始化,它不能用于任何事情。
相反,您可能应该传递当前Activity:this@MainActivity

相关问题