初始化问题但已经初始化了 Kotlin
initialization problem but already iinitialized Kotlin
当我尝试 运行 我的应用程序时,错误显示您已经初始化了适配器,我已经初始化了它,并且在我初始化它之后。它表明 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
这个,我已经初始化了。请帮忙提前致谢
您没有初始化“recyclerView”本身。您可能应该按照 recyclerView = findViewById(R.id.recyclerView)
的方式进行操作,或者从 class 的顶部删除 lateinit var recyclerView
。该变量可能与直接来自您的布局的视图本身冲突。
这里有几点需要注意
- 您已将每个 属性 用作 lateinit
- 在 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
}
}
}
}
.........
....
}
当我尝试 运行 我的应用程序时,错误显示您已经初始化了适配器,我已经初始化了它,并且在我初始化它之后。它表明 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 这个,我已经初始化了。请帮忙提前致谢
您没有初始化“recyclerView”本身。您可能应该按照 recyclerView = findViewById(R.id.recyclerView)
的方式进行操作,或者从 class 的顶部删除 lateinit var recyclerView
。该变量可能与直接来自您的布局的视图本身冲突。
这里有几点需要注意
- 您已将每个 属性 用作 lateinit
- 在 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
}
}
}
}
.........
....
}