Android Kotlin中使用RecyclerView实现聊天界面————第一行代码

文章目录

          • 效果图
          • demo下载
          • 代码实现
            • 1. 首先准备两张 接收 和 发送的图片,做成9-Patch图片
            • 2. 准备两个布局,一个接收的 一个是发送的,效果如下
            • 3. 准备一个实体类,代码如下
            • 4. 实现RecyclerView 的适配器,代码如下
            • 5. 实现主界面的布局,效果如下
            • 6. MainActivity中的代码如下

效果图

Android Kotlin中使用RecyclerView实现聊天界面————第一行代码_第1张图片

demo下载

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

代码实现
1. 首先准备两张 接收 和 发送的图片,做成9-Patch图片

      在这里插入图片描述    在这里插入图片描述

2. 准备两个布局,一个接收的 一个是发送的,效果如下

Android Kotlin中使用RecyclerView实现聊天界面————第一行代码_第2张图片  Android Kotlin中使用RecyclerView实现聊天界面————第一行代码_第3张图片
代码比较简单,我就不贴了

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. 实现主界面的布局,效果如下

Android Kotlin中使用RecyclerView实现聊天界面————第一行代码_第4张图片

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

到这里就完成了,有兴趣的可以研究以下。

你可能感兴趣的:(Android,#,Kotlin)