android - Android Kotlin Pusher Chatkit 未在回收站视图中加载所有房间
问题描述
我正在尝试在推送聊天工具回收器视图中查看所有已加入的房间,但它似乎不起作用。我滚动后它只加载一个房间。当我打开活动时,它显示为空白。此外,当我点击房间时,意图并没有启动,它只是停留在回收站视图上。它应该去选定的聊天室。
通过调试,我可以看到我正在连接到可访问的房间(其中有 7 个)但是似乎只有其中一个被添加到适配器/回收器视图中但是我找不到它的不足之处. 我对 kotlin 比较陌生,这可能会增加这个问题。
这是我正在遵循的教程,我认为开箱即用相对较好,但似乎有一些障碍。
任何和所有的帮助表示赞赏。
聊天室列表活动
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
/*
recycler_view.apply {
val topSpacingDecorator = TopSpacingItemDecoration(30)
addItemDecoration(topSpacingDecorator)
recycler_view.layoutManager = LinearLayoutManager(this@ChatRoomsListActivity)
recycler_view.adapter = adapter
adapter = ChatRoomsListAdapter();
adapter = adapter
}
*/
}
private fun initChatManager() {
val chatManager = ChatManager(
instanceLocator = "xxxxxxxxxxxxxx",
userId = "username1-PCKid",
dependencies = AndroidChatkitDependencies(
tokenProvider = ChatkitTokenProvider(
endpoint = "yyyyyyyyyyyyyyyyyyy",
// 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]) // reads users rooms
}
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)
Log.d("roomSelected", "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, ChatRoomActivity::class.java)
intent.putExtra("room_id", room.id)
intent.putExtra("room_name", room.name)
startActivity(intent)
}
}
聊天室列表适配器
class ChatRoomsListAdapter: RecyclerView.Adapter<ChatRoomsListAdapter.ViewHolder>() {
private var list = ArrayList<Room>()
private var roomClickedInterface: RoomClickedInterface? = null
// lateinit var roomClickedInterface:RoomClickedInterface
fun addRoom(room:Room){
list.add(room)
notifyDataSetChanged()
// Log.d("Rooms", room.toString())
}
fun setInterface(roomClickedInterface:RoomClickedInterface){
this.roomClickedInterface = roomClickedInterface
// roomClickedInterface = roomClickedInterface
}
override fun getItemCount(): Int {
return list.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(
// R.layout.chat_list_row,
android.R.layout.simple_list_item_1,
parent,
false
)
return ViewHolder(view)
}
/*
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
}
/*
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])
Toast.makeText(itemView.context, "hello test", Toast.LENGTH_LONG).show();
Log.d("test", "testing console log")
}
var roomName: TextView = itemView.findViewById(android.R.id.text1)
init {
itemView.setOnClickListener(this)
}
}
interface RoomClickedInterface{
fun roomSelected(room:Room)
}
}
解决方案
您需要确保您正在调用adapter.notifyDataSetChanged()。所以改变
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])
}
}
}
}
至
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.notifyDataSetChanged()
}
}
}
推荐阅读
- r - R中Y轴上有两个变量的频率分布直方图
- mongodb - AWS DocumentDB 中架构验证的替代方法
- css - 如何防止背景图像像素化?
- sql-server - SSIS -- 未能部署项目。错误 27203
- python - 根据条件生成新列
- javascript - Angular Router usehash:导航不保留hastag之前的url
- html - 如何在使用 puppeteer 生成的 pdf 上使用 Roboto 字体系列
- swift - 在 List SwiftUI 2.0 中的 TextField 之间切换焦点
- angular - 使用@angular/cdk/drag-drop 中的 cdkDragFreeDragPosition 平滑移动到 x 和 y 位置
- react-native - 在您的分支中找不到任何 React Native Android 项目 - 代码推送