我必须在我的覆盖有趣的通知AllIsChecked中使用selectAllCheckBox,但是变量seltAllCheckBox似乎未初始化,尽管它已经在onCreate方法中进行了初始化.

问题出在onCreate、lateinit声明和notifyAllIslogy函数中.

package com.example.lslmbeta

import android.annotation.SuppressLint
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.lslmbeta.databinding.ActivityMainBinding
import com.example.lslmbeta.datamanagement.dataReader
import com.example.lslmbeta.recyclerview.ItemAdapter
import com.google.android.material.appbar.MaterialToolbar
import com.google.android.material.checkbox.MaterialCheckBox
import kotlinx.coroutines.launch
import java.text.SimpleDateFormat


class MainActivity : AppCompatActivity(), OnAllIsCheckedListener {
    companion object {
        var isInSelectionMode: Boolean? = null
    }

    private val MAIN_ACTIVITY_TAG = "Main Activity"

    private lateinit var recyclerView: RecyclerView

    private lateinit var closeView: MenuItem
    private lateinit var selectView: MenuItem
    private lateinit var moreView: MenuItem

    private lateinit var itemAdapter: ItemAdapter
    private lateinit var selectAllCheckBox: MaterialCheckBox

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.top_app_bar, menu)

        // Menu Group Selection
        closeView = menu.findItem(R.id.menu_item_close)

        // Menu Group Non Selection
        selectView = menu.findItem(R.id.menu_item_select)
        moreView = menu.findItem(R.id.menu_item_more)

        enableOrDisableSelection()

        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item) {
            closeView -> {
                enableOrDisableSelection()
                true
            }

            selectView -> {
                if (::itemAdapter.isInitialized) enableOrDisableSelection()
                true
            }

            moreView -> {
                // Gestisci il clic sull'elemento "More" (menu a scomparsa)
                true
            }

            else -> super.onOptionsItemSelected(item)
        }
    }

    //TODO togliere il suppress
    @SuppressLint("SimpleDateFormat")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        val topToolBar = binding.topToolBar
        setSupportActionBar(topToolBar)

        WindowCompat.setDecorFitsSystemWindows(window, false)

        val dateString = "19/10/2023"
        val dateFormat = SimpleDateFormat("dd/MM/yyyy")
        val date = dateFormat.parse(dateString)

        recyclerView = binding.homeRecycleView
        selectAllCheckBox = binding.selectAllCheckbox

        Log.d(MAIN_ACTIVITY_TAG, "Select All Checkbox: ${::selectAllCheckBox.isInitialized}")

        selectAllCheckBox.setOnClickListener {
            if (selectAllCheckBox.isChecked) {
                itemAdapter.checkAll()
            } else {
                itemAdapter.clearCheckedItems()
            }
        }

        lifecycleScope.launch {
            val myDataset = dataReader(this@MainActivity, date)
            itemAdapter = ItemAdapter(myDataset)
            recyclerView.layoutManager = LinearLayoutManager(this@MainActivity)
            recyclerView.adapter = itemAdapter
            recyclerView.setHasFixedSize(true)

            itemAdapter.setCustomListener(MainActivity())
        }
    }

    override fun notifyAllIsChecked(isAllChecked: Boolean) {
        Log.d(MAIN_ACTIVITY_TAG, "Is Ready: ${::selectAllCheckBox.isInitialized}")

        if (::selectAllCheckBox.isInitialized) selectAllCheckBox.isChecked = isAllChecked
    }

    @SuppressLint("NotifyDataSetChanged")
    private fun enableOrDisableSelection() {
        val topToolBar = findViewById<MaterialToolbar>(R.id.topToolBar)
        val checkBox = findViewById<MaterialCheckBox>(R.id.select_all_checkbox)

        if (isInSelectionMode == null) {
            isInSelectionMode = false
            Log.w("Enable Or Disable Selection", "Is NULL")
        } else {
            isInSelectionMode = !isInSelectionMode!!
        }

        Log.d("Enable Or Disable Selection", isInSelectionMode.toString())

        // Group Selection
        closeView.isVisible = isInSelectionMode!!

        checkBox.isVisible = isInSelectionMode!!

        // Group Non Selection
        selectView.isVisible = !isInSelectionMode!!
        moreView.isVisible = !isInSelectionMode!!

        topToolBar.title = if (isInSelectionMode!!) "" else getString(R.string.app_name)

        if (isInSelectionMode!!) {
            itemAdapter.clearCheckedItems()
        } else {
            recyclerView.adapter?.notifyDataSetChanged()
        }
    }
}

我使用了日志(log),并注意到它在通知AllIsChecked方法中的调用之前被初始化.

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

推荐答案

我认为问题出在这里:

itemAdapter.setCustomListener(MainActivity())

我们永远不应该手动实例化活动.您作为侦听器传递的活动未初始化,它几乎不能用于任何事情.

相反,您可能应该传递当前活动:this@MainActivity.

Android相关问答推荐

垂直居中图标

listOf(listOf(字符串))在lazyArchitect(lazyStream)中合成

Android深度链接配置中的URL片段匹配'

对支持哪些数据存储区方法感到困惑

Android:微调:在代码中设置ArrayAdapter不希望调用On ItemSelected,仅当用户单击微调时调用

如何使可拖动内容停留在可组合框的边界内

SmsMessage如何在Kotlin库中工作?

ComposeView 抢走了 AndroidTV 内容的焦点

如何在Android Studio中删除项目

我可以从 Android 中的选定文本中获取周围的文本吗?

我如何比较多个时间范围并在 Android Compose 中并排显示它们

setContentView() 方法的签名

NFC getNdefMessage 在 Android 13 上写入标签后返回 null

Android Studio 复制类 kotlin

如何在 Jetpack Compose 中设置卡片高度

compose 导航参数字符串包含花括号?

在compose中,为什么修改List元素的属性,LazyColumn不刷新

Android Jetpack Compose - 每次文本字段值更改时,可组合函数都会重新组合

Android:为什么 ICICI iMobile Pay 应用程序在我的应用程序中显示root/jailbroken设备?

在使用 Retrofit 和 Room 时,我是否需要提及协程调度程序?