【问题标题】:initialization problem but already iinitialized Kotlin初始化问题,但已经初始化 Kotlin
【发布时间】:2020-12-25 21:19:22
【问题描述】:

当我尝试运行我的应用程序时,错误表明您已经初始化了适配器,我已经初始化了它,并且在我初始化它之后。它表明 reyclerview 也必须是 init,但正如我所做的那样,我已经没有得到解决方案,请提供帮助,在此先感谢。

代码如下

 package com.example.itemgetset
    
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.os.Handler
import android.os.Message
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Button
import android.widget.LinearLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    lateinit var activity: Activity
    val userList = ArrayList<ProductInfoGetSet>()
    lateinit var btnProductAdd: Button
    lateinit var llEmptyView: LinearLayout
    lateinit var llMain: LinearLayout
    lateinit var recyclerView: RecyclerView
    lateinit var llFab: LinearLayout
    lateinit var linearLayoutManager: LinearLayoutManager
    lateinit var gridLayoutManager: GridLayoutManager
    lateinit var adapter: CustomAdapter

    companion object {
        var handler: Handler = Handler()
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        linearLayoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        recyclerView.layoutManager = linearLayoutManager
        gridLayoutManager = GridLayoutManager(this, 2)
        recyclerView.layoutManager = gridLayoutManager
        activity = this
        initView()
        onClicks()
        setUpData()

        if (this::adapter.isInitialized)

            handler = @SuppressLint("HandlerLeak")
            object : Handler() {
                override fun handleMessage(msg: Message) {
                    if (msg.what == 111) {
                        var temp = Temp()
                        temp = msg.obj as Temp

                        if (temp.id == "") {
                            userList.add(
                                ProductInfoGetSet(
                                    (userList.size + 1).toString(),
                                    temp.name,
                                    temp.quantity,
                                    temp.price,
                                )
                            )
                            adapter = CustomAdapter(activity, userList)
                            recyclerView.adapter = adapter
                        } else {
                            for (i in userList.indices) {
                                if (userList[i].id == temp.id) {
                                    userList[i].id = temp.id
                                    userList[i].name = temp.name
                                    userList[i].quantity = temp.quantity
                                    userList[i].price = temp.price
                                }
                            }
                            adapter.notifyDataSetChanged()
                        }
                    }
                    if (userList.size > 0) {
                        llEmptyView.visibility = View.GONE
                        llMain.visibility = View.VISIBLE
                    } else {
                        llEmptyView.visibility = View.VISIBLE
                        llMain.visibility = View.GONE
                    }
                }
            }
    }

    private fun initView() {
        btnProductAdd = findViewById(R.id.btn_product_add)
        llFab = findViewById(R.id.ll_fab)
        llEmptyView = findViewById(R.id.llEmptyView)
        llMain = findViewById(R.id.llMain)
        recyclerView = findViewById(R.id.recycler_view)
        recyclerView.layoutManager = LinearLayoutManager(this)
    }

    private fun onClicks() {
        btnProductAdd.setOnClickListener {
            val intent = Intent(this@MainActivity, AddDetails::class.java)
            intent.putExtra("isFor", "Add")
            startActivity(intent)
        }
        llFab.setOnClickListener {
            val intent = Intent(this@MainActivity, AddDetails::class.java)
            intent.putExtra("isFor", "Add")
            startActivity(intent)
        }
    }

    private fun setUpData() {
        if (userList.size > 0) {
            llEmptyView.visibility = View.GONE
            llMain.visibility = View.VISIBLE
        } else {
            llEmptyView.visibility = View.VISIBLE
            llMain.visibility = View.GONE
        }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        if (item.itemId == R.id.menu_view) {
            changeLayoutManager()
            return true
        }
        return super.onOptionsItemSelected(item)
    }

    private fun changeLayoutManager() {
        if (recycler_view.layoutManager == linearLayoutManager) {
            recycler_view.layoutManager = gridLayoutManager
            if (userList.size != 1) return
        } else {
            recycler_view.layoutManager = linearLayoutManager
        }
    }
}

显示的错误如下

  Process: com.example.itemgetset, PID: 17453
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.itemgetset/com.example.itemgetset.MainActivity}: kotlin.UninitializedPropertyAccessException: lateinit property recyclerView has not been initialized
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3385)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3524)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2131)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7707)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
     Caused by: kotlin.UninitializedPropertyAccessException: lateinit property recyclerView has not been initialized
        at com.example.itemgetset.MainActivity.onCreate(MainActivity.kt:43)
        at android.app.Activity.performCreate(Activity.java:7825)
        at android.app.Activity.performCreate(Activity.java:7814)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1325)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3360)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3524) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2131) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7707) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 

第 43 行是 recyclerView.layoutManager = gridLayoutManager 这和我已经初始化了。请帮忙提前谢谢

【问题讨论】:

  • 您应该在一切运行之前在 onCreate 中初始化变量,或者使用延迟初始化:val recyclerView: RecyclerView by lazy { findViewById(R.id.recycler_view) }
  • 我也尝试过,但是当我这样做时,之后还出现了一个错误,即 lateinit 属性适配器尚未初始化。在我单独初始化它之后,我的 reyclerview 中不会显示任何项目
  • 你必须定义那些......将它们声明为 lateinit 不会让它们持有引用......
  • 你能举个例子吗,我不明白。谢谢

标签: android kotlin android-recyclerview android-handler


【解决方案1】:

这里有几件事需要注意

  1. 您已将每个属性都用作lateinit
  2. 在 setContentView(...) 之后初始化视图

试试这个:

    class MainActivity : AppCompatActivity() {
    
        lateinit var activity: Activity
        val userList = ArrayList<ProductInfoGetSet>()
        lateinit var btnProductAdd: Button
        lateinit var llEmptyView: LinearLayout
        lateinit var llMain: LinearLayout
        lateinit var recyclerView: RecyclerView
        lateinit var llFab: LinearLayout
        lateinit var linearLayoutManager: LinearLayoutManager
        lateinit var gridLayoutManager: GridLayoutManager
        lateinit var adapter: CustomAdapter
    
        companion object {
            var handler: Handler = Handler()
        }
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            initView()
            linearLayoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
            recyclerView.layoutManager = linearLayoutManager
            gridLayoutManager = GridLayoutManager(this, 2)
            recyclerView.layoutManager = gridLayoutManager
            activity = this
            onClicks()
            setUpData()
    
            if (this::adapter.isInitialized)
    
                handler = @SuppressLint("HandlerLeak")
                object : Handler() {
                    override fun handleMessage(msg: Message) {
                        if (msg.what == 111) {
                            var temp = Temp()
                            temp = msg.obj as Temp
    
                            if (temp.id == "") {
                                userList.add(
                                    ProductInfoGetSet(
                                        (userList.size + 1).toString(),
                                        temp.name,
                                        temp.quantity,
                                        temp.price,
                                    )
                                )
                                adapter = CustomAdapter(activity, userList)
                                recyclerView.adapter = adapter
                            } else {
                                for (i in userList.indices) {
                                    if (userList[i].id == temp.id) {
                                        userList[i].id = temp.id
                                        userList[i].name = temp.name
                                        userList[i].quantity = temp.quantity
                                        userList[i].price = temp.price
                                    }
                                }
                                adapter.notifyDataSetChanged()
                            }
                        }
                        if (userList.size > 0) {
                            llEmptyView.visibility = View.GONE
                            llMain.visibility = View.VISIBLE
                        } else {
                            llEmptyView.visibility = View.VISIBLE
                            llMain.visibility = View.GONE
                        }
                    }
                }
        }
.........
....
}

【讨论】:

  • 谢谢@chandmohd,它可以工作,但是当我运行应用程序和一些数据时,它不会显示任何内容,没有为输入的数据创建卡。
  • 如果它解决了您的问题,请接受此答案以供将来参考
  • 它表明lateinit 属性适配器尚未初始化。提前致谢
【解决方案2】:

您没有初始化“recyclerView”本身。您可能应该使用recyclerView = findViewById(R.id.recyclerView) 或从班级顶部删除lateinit var recyclerView。该变量可能与直接来自您的布局的视图本身发生冲突。

【讨论】:

  • 在我从顶部删除它后,它会在使用 recycler_view 的所有地方显示下面的错误,我也这样做,如 'val recyclerView = findViewById(R.id.recyclerView)' 但没有完成。仍然发生错误
  • initView() 函数移到setContentView() 的正下方,然后将lateinit var recyclerView: RecyclerView 添加回类的顶部。 initView() 在你尝试访问你的视图之后被调用,它应该在之前被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
相关资源
最近更新 更多