文章目錄
效果圖
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))
}
}
到這裏就完成了,有興趣的可以研究以下。