初始化问题,但已经初始化Kotlin

时间:2020-09-07 12:36:39

标签: android kotlin android-recyclerview android-handler

当我尝试运行我的应用程序时,错误显示您已经初始化了适配器,而我已经初始化了适配器。它表明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 这个,我已经初始化了。请提供帮助。在此先感谢

2 个答案:

答案 0 :(得分:1)

您没有初始化“ recyclerView”本身。您可能应该将其作为recyclerView = findViewById(R.id.recyclerView)来执行,或者从类的顶部删除lateinit var recyclerView。该变量可能与直接来自您的布局的视图本身冲突。

答案 1 :(得分:0)

这里没有什么要注意的

  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
                        }
                    }
                }
        }
.........
....
}