Android Kotlin Pusher Chatkit无法在回收器视图中加载所有房间

问题描述 投票:0回答:1

我正在尝试在pusher chatkit回收器视图中查看所有已加入的房间,但是似乎没有用。滚动后仅加载一个房间。当我打开活动时,它显示为空白。另外,当我单击房间时,意图并没有开始,只是停留在回收者视图上。它应该转到所选的聊天室。

通过调试,我能够看到我正在连接到可访问的房间(有7个房间),但是似乎只有一个房间正在添加到适配器/回收器视图中,但是我找不到它在哪里短期下跌。我对Kotlin比较陌生,这可能会增加问题。

Here是我正在关注的教程,我认为开箱即用会比较好,但是似乎存在一些障碍。

任何帮助都将受到赞赏。

ChatRoomsListActivity

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

ChatRoomsListAdapter

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

应该在Recyclerview中显示的房间1)enter image description here

2)enter image description here

这是我向任意方向滚动后的样子3)enter image description here

android kotlin recycler-adapter pusher chatkit
1个回答
0
投票

您需要确保正在呼叫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])
        }
      }
    }
  }

to

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()
      }
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.