Android Kotlin中使用RecyclerView實現聊天界面————第一行代碼

效果圖

在這裏插入圖片描述

demo下載

https://download.csdn.net/download/ljp345775/12452929

代碼實現
1. 首先準備兩張 接收 和 發送的圖片,做成9-Patch圖片

      在這裏插入圖片描述    在這裏插入圖片描述

2. 準備兩個佈局,一個接收的 一個是發送的,效果如下

在這裏插入圖片描述  在這裏插入圖片描述
代碼比較簡單,我就不貼了

3. 準備一個實體類,代碼如下
/**
 * @作者: ljp
 * @時間: 2020/5/24 7:43
 * @描述:content:內容,type:類型
 **/
class Msg(val content: String, val type: Int) {

    //伴生對象,類似於java的靜態方法
    companion object {
        const val TYPE_RECEIVED = 0
        const val TYPE_SEND = 1
    }
}
4. 實現RecyclerView 的適配器,代碼如下
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView

/**
 * @作者: ljp
 * @時間: 2020/5/24 8:02
 * @描述:
 **/
class MsgAdapter(var data: List<Msg>) : RecyclerView.Adapter<MsgAdapter.MsgViewHolder>() {
    //密封類
    sealed class MsgViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        class LeftVH(view: View) : MsgViewHolder(view) {
            val leftMsg: TextView = view.findViewById(R.id.tv_left_item)
        }
        class RightVH(view: View) : MsgViewHolder(view) {
            val rightMsg: TextView = view.findViewById(R.id.tv_right_item)
        }
    }

    override fun getItemViewType(position: Int) = data[position].type

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MsgViewHolder {
        val vh: MsgViewHolder
        if (viewType == Msg.TYPE_RECEIVED) {
            val view =
                LayoutInflater.from(parent.context).inflate(R.layout.msg_left_item, parent, false)
            vh = MsgViewHolder.LeftVH(view)
        } else {
            val view =
                LayoutInflater.from(parent.context).inflate(R.layout.msg_right_item, parent, false)
            vh = MsgViewHolder.RightVH(view)
        }
        return vh
    }

    override fun getItemCount() = data.size

    override fun onBindViewHolder(holder: MsgViewHolder, position: Int) {
        var msg = data[position]
        when (holder) {
            is MsgViewHolder.LeftVH -> holder.leftMsg.text = msg.content
            is MsgViewHolder.RightVH -> holder.rightMsg.text = msg.content
        }
    }
}
5. 實現主界面的佈局,效果如下

在這裏插入圖片描述

6. MainActivity中的代碼如下
package com.example.kotlindemo2

import android.annotation.SuppressLint
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.os.Message
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), View.OnClickListener {

    private val data = ArrayList<Msg>()
    //對變量延遲初始化
    private lateinit var adapter: MsgAdapter

    @SuppressLint("HandlerLeak")
    val handler = object : Handler() {
        override fun handleMessage(msg: Message) {
            when (msg.what) {
                0 -> {
                    var toString = msg.obj.toString()
                    var msg = Msg(toString, Msg.TYPE_RECEIVED)
                    data.add(msg)
                    //通知列表有數據插入
                    adapter.notifyItemInserted(data.size - 1)
                    //把數據定位到最後一行
                    recview.scrollToPosition(data.size - 1)
                }
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initData()
        adapter = MsgAdapter(data)
        var linearLayoutManager = LinearLayoutManager(this)
        recview.layoutManager = linearLayoutManager
        recview.adapter = adapter
        btn_send.setOnClickListener(this)
    }

    override fun onClick(v: View?) {

        when (v) {
            btn_send -> {
                var content = edt_msg.text.toString()
                if (content.isNotEmpty()) {
                    Log.e("aaa", "size->" + data.size)
                    var msg = Msg(content, Msg.TYPE_SEND)
                    data.add(msg)
                    Log.e("aaa", "size->" + data.size)
                    //通知列表有數據插入
                    adapter.notifyItemInserted(data.size - 1)
                    //把數據定位到最後一行
                    recview.scrollToPosition(data.size - 1)
                    //清空數據
                    edt_msg.setText("")
                    //開啓線程
                    startThread(content)

                } else {
                    Toast.makeText(this, "不能發送空消息", Toast.LENGTH_SHORT).show()
                }
            }
        }

    }
    //用來添加接收的數據
    private fun startThread(str: String) {
        Thread {
            Thread.sleep(1000)
            var message = Message()
            message.what = 0
            message.obj = str
            handler.sendMessage(message)
        }.start()
    }
    private fun initData() {
        data.add(Msg("你好?", Msg.TYPE_RECEIVED))
        data.add(Msg("你好,你是誰?", Msg.TYPE_SEND))
        data.add(Msg("我是你的新同事。我叫Jackson,請多指教", Msg.TYPE_RECEIVED))
    }
}

到這裏就完成了,有興趣的可以研究以下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章