- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试按照 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)
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)
}
}
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 withlateinit
keyword. It will not allocate memory until initialized.
lateinit
属性,然后再尝试使用它。
setInterface()
在单击列表项之前初始化属性。您还可以检查
lateinit
var 已经初始化或未使用
.isInitialized
如下所示:
override fun onClick(p0: View?) {
if(this::roomClickedInterface.isInitialized) {
roomClickedInterface.roomSelected(list[adapterPosition])
}
}
lateinit
来自您的适配器的属性,也是它的 setter
//lateinit var roomClickedInterface:RoomClickedInterface
RoomClickedInterface
作为适配器构造函数的参数
class ChatRoomsListAdapter(val roomClickedInterface:RoomClickedInterface):
RecyclerView.Adapter<ChatRoomsListAdapter.ViewHolder>() {
//Implementation
}
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/
我在多个项目中使用了共享首选项的代码,它可以正常工作,但是现在当我在另一个项目中应用相同的代码时,它停止工作。以下是错误 kotlin.UninitializedPropertyAccessExcep
好的,所以我在如下小部件中声明了lateinit var job。 class TempHumidDisplayWidget : AppWidgetProvider(), CoroutineScope
kotlin.UninitializedPropertyAccessException: 在 com.videoplayer.VideoPlayerActivity.onStart (VideoPla
Json Server 数据显示在 android 中使用 retrofit2 和 rxjava2 当参数传递到接口(interface)然后给出错误。 class Sales : AppCompat
我正在尝试按照 Pusher Chatkit 的 "BUILDING A GROUP CHAT APP USING KOTLIN AND PUSHER CHATKIT" 教程进行操作。但是我遇到了 R
rv.adapter = adapter rv.layoutManager = LinearLayoutManager(context) setHasOptionsMenu(true)
我不断得到kotlin.UninitializedPropertyAccessException: lateinit property xxx has not been initialized在我的
我收到的错误是“java.lang.RuntimeException:无法启动 Activity ComponentInfo {com.ginem.rxjavaandretrofit2demo/com
我遇到一个问题,我的 android 仪器测试没有被发现。相反,我得到以下信息: Started running tests Test running failed: Instrumentation
大家好,我正在使用 Spring Boot 开发一个应用程序,尽管我在生成以下错误的线程中初始化 JPA 存储库时遇到一些问题 Exception in thread "Thread-6" kotli
我是一名优秀的程序员,十分优秀!