gpt4 book ai didi

android - kotlin.UninitializedPropertyAccessException : lateinit property roomClickedInterface has not been initialized

转载 作者:行者123 更新时间:2023-12-02 12:19:30 28 4
gpt4 key购买 nike

我正在尝试按照 Pusher Chatkit 的 "BUILDING A GROUP CHAT APP USING KOTLIN AND PUSHER CHATKIT" 教程进行操作。但是我遇到了 Recycler View 适配器的问题。仅供引用,我仍在学习 Kotlin。我一直在阅读有关 lateinit vars 的内容,但找不到任何可以解决这种情况的内容。错误发生在回收器 View 适配器中。

这是我得到的错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android_myneighborsbookshelf, PID: 26692
kotlin.UninitializedPropertyAccessException: lateinit property roomClickedInterface has not been initialized
at com.example.android_myneighborsbookshelf.adapters.ChatRoomsListAdapter.getRoomClickedInterface(ChatRoomsListAdapter.kt:13)
at com.example.android_myneighborsbookshelf.adapters.ChatRoomsListAdapter$ViewHolder.onClick(ChatRoomsListAdapter.kt:66)
at android.view.View.performClick(View.java:6597)
at android.view.View.performClickInternal(View.java:6574)
at android.view.View.access$3100(View.java:778)
at android.view.View$PerformClick.run(View.java:25885)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

ChatRoomsListActivity.kt
class ChatRoomsListActivity : AppCompatActivity() {
val adapter = ChatRoomsListAdapter();

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_chat_room_list)
initRecyclerView()
initChatManager()
}

private fun initRecyclerView() {
recycler_view.layoutManager = LinearLayoutManager(this@ChatRoomsListActivity)
recycler_view.adapter = adapter
}

private fun initChatManager() {
val chatManager = ChatManager(
instanceLocator = "blahblahblah",
userId = "username1-PCKid",
dependencies = AndroidChatkitDependencies(
tokenProvider = ChatkitTokenProvider(
endpoint = "blahblahblah",
// endpoint = "http://10.0.2.2:3000/auth",
userId = "username1-PCKid"
)
)
)

chatManager.connect(listeners = ChatListeners(
onErrorOccurred = { },
onAddedToRoom = { },
onRemovedFromRoom = { },
onCurrentUserReceived = { },
onNewReadCursor = { },
onRoomDeleted = { },
onRoomUpdated = { },
onPresenceChanged = { u, n, p -> },
onUserJoinedRoom = { u, r -> },
onUserLeftRoom = { u, r -> },
onUserStartedTyping = { u, r -> },
onUserStoppedTyping = { u, r -> }
)) { result ->
when (result) {
is Result.Success -> {
// We have connected!
val currentUser = result.value
AppController.currentUser = currentUser
val userJoinedRooms = ArrayList<Room>(currentUser.rooms)
for (i in 0 until userJoinedRooms.size) {
adapter.addRoom(userJoinedRooms[i])
}

currentUser.getJoinableRooms { result ->
when (result) {
is Result.Success -> {
// Do something with List<Room>
val rooms = result.value
runOnUiThread {
for (i in 0 until rooms.size) {
adapter.addRoom(rooms[i])
}
}
}
}
}

adapter.setInterface(object : ChatRoomsListAdapter.RoomClickedInterface {
override fun roomSelected(room: Room) {
if (room.memberUserIds.contains(currentUser.id)) {
// user already belongs to this room
roomJoined(room)
} else {
currentUser.joinRoom(
roomId = room.id,
callback = { result ->
when (result) {
is Result.Success -> {
// Joined the room!
roomJoined(result.value)
}
is Result.Failure -> {
Log.d("TAG", result.error.toString())
}
}
}
)
}
}
})
}

is Result.Failure -> {
// Failure
Log.d("TAG", result.error.toString())
}
}
}
}

private fun roomJoined(room: Room) {
val intent = Intent(this@ChatRoomsListActivity, ChatRoomsListActivity::class.java)
intent.putExtra("room_id", room.id)
intent.putExtra("room_name", room.name)
startActivity(intent)
}
}


RecyclerView 适配器
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.pusher.chatkit.rooms.Room
import android.view.LayoutInflater
import androidx.recyclerview.widget.RecyclerView
import com.example.android_myneighborsbookshelf.R

class ChatRoomsListAdapter: RecyclerView.Adapter<ChatRoomsListAdapter.ViewHolder>() {
private var list = ArrayList<Room>()
lateinit var roomClickedInterface:RoomClickedInterface // <-- Error occurs here - kt.13

fun addRoom(room:Room){
list.add(room)
notifyDataSetChanged()
}

fun setInterface(roomClickedInterface:RoomClickedInterface){
this.roomClickedInterface = roomClickedInterface
}

override fun getItemCount(): Int {
return list.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(
android.R.layout.simple_list_item_1,
parent,
false
)

return ViewHolder(view)
}


override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.roomName.text = list[position].name

}

inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView), View.OnClickListener {
override fun onClick(p0: View?) {
roomClickedInterface.roomSelected(list[adapterPosition]) // <-- Error occurs here kt.66
}

var roomName: TextView = itemView.findViewById(android.R.id.text1)

init {
itemView.setOnClickListener(this)
}
}

interface RoomClickedInterface{
fun roomSelected(room:Room)
}
}

任何和所有的帮助表示赞赏。

最佳答案

lateinit means late initialization. If you do not want to initialize a variable in the constructor, instead you want to initialize it later on and if you can guarantee the initialization before using it, then declare that variable with lateinit keyword. It will not allocate memory until initialized.



所以,你必须初始化 lateinit属性,然后再尝试使用它。

选项 - 1:调用 setInterface()在单击列表项之前初始化属性。您还可以检查 lateinit var 已经初始化或未使用 .isInitialized如下所示:
override fun onClick(p0: View?) {

if(this::roomClickedInterface.isInitialized) {
roomClickedInterface.roomSelected(list[adapterPosition])
}
}

选项 - 2:删除 lateinit来自您的适配器的属性,也是它的 setter
//lateinit var roomClickedInterface:RoomClickedInterface

并通过 RoomClickedInterface作为适配器构造函数的参数
class ChatRoomsListAdapter(val roomClickedInterface:RoomClickedInterface):
RecyclerView.Adapter<ChatRoomsListAdapter.ViewHolder>() {

//Implementation
}

选项 - 3:删除 lateinit并使用 nullable属性(property)
private var roomClickedInterface: RoomClickedInterface? = null

然后像下面一样使用 null安全符号 ?. :
override fun onClick(p0: View?) {
roomClickedInterface?.roomSelected(list[adapterPosition])
}

关于android - kotlin.UninitializedPropertyAccessException : lateinit property roomClickedInterface has not been initialized,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59632501/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com