chat页显示数据

This commit is contained in:
itgaojian163 2024-10-31 21:33:39 +08:00
parent 1e5d8ab709
commit ae61b72fc3
3 changed files with 62 additions and 24 deletions

View File

@ -65,7 +65,7 @@ interface MsgDao {
fun getMsgByPage(form: String?, pageSize: Int, page: Int): List<MsgBean?>? fun getMsgByPage(form: String?, pageSize: Int, page: Int): List<MsgBean?>?
/** /**
* 查询与单人的聊天记录 * 查询与单人的聊天记录-分页
*/ */
@Query("SELECT * FROM db_msg t1 WHERE t1.id IN (SELECT id FROM db_msg WHERE `senderId`=(:form) AND `receiverId`=(:to) OR `senderId`=(:to) AND `receiverId`=(:form) ORDER BY timestamp DESC LIMIT (((:page)-1)*(:pageSize)),(:pageSize)) ORDER by t1.timestamp ASC") @Query("SELECT * FROM db_msg t1 WHERE t1.id IN (SELECT id FROM db_msg WHERE `senderId`=(:form) AND `receiverId`=(:to) OR `senderId`=(:to) AND `receiverId`=(:form) ORDER BY timestamp DESC LIMIT (((:page)-1)*(:pageSize)),(:pageSize)) ORDER by t1.timestamp ASC")
fun getMsgByFromOrToPage( fun getMsgByFromOrToPage(
@ -75,6 +75,15 @@ interface MsgDao {
page: Int page: Int
): List<MsgBean?>? ): List<MsgBean?>?
/**
* 查询与单人的聊天记录-全部
*/
@Query("SELECT * FROM db_msg t1 WHERE t1.id IN (SELECT id FROM db_msg WHERE senderId=:form AND receiverId=:to OR senderId=:to AND receiverId=:form ORDER BY timestamp DESC) ORDER by t1.timestamp ASC")
fun getMsgByFromOrToPage(
form: String,
to: String,
): List<MsgBean>
/** /**
* 清空与某个人的聊天记录 * 清空与某个人的聊天记录
*/ */

View File

@ -1,5 +1,6 @@
package com.tenlionsoft.aimz_k.page.activity package com.tenlionsoft.aimz_k.page.activity
import android.annotation.SuppressLint
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@ -8,6 +9,7 @@ import android.util.Log
import android.view.WindowManager import android.view.WindowManager
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.atwa.filepicker.core.FilePicker import com.atwa.filepicker.core.FilePicker
import com.tenlionsoft.aimz_k.R import com.tenlionsoft.aimz_k.R
@ -16,6 +18,7 @@ import com.tenlionsoft.aimz_k.model.PickerType
import com.tenlionsoft.aimz_k.viewmodel.ChatPageViewModel import com.tenlionsoft.aimz_k.viewmodel.ChatPageViewModel
import com.tenlionsoft.baselib.base.BaseActivity import com.tenlionsoft.baselib.base.BaseActivity
import com.tenlionsoft.baselib.contacts.ProjectConfig import com.tenlionsoft.baselib.contacts.ProjectConfig
import com.tenlionsoft.baselib.utils.SpUtils
import com.tenlionsoft.baselib.widget.wheel.WheelView import com.tenlionsoft.baselib.widget.wheel.WheelView
/** /**
@ -23,17 +26,23 @@ import com.tenlionsoft.baselib.widget.wheel.WheelView
*/ */
class ChatActivity : BaseActivity() { class ChatActivity : BaseActivity() {
private lateinit var mBinding: ActivityChatBinding private lateinit var mBinding: ActivityChatBinding
private val chatPageViewModel: ChatPageViewModel by lazy {
ViewModelProvider(this)[ChatPageViewModel::class.java]
}
private lateinit var mLocalReceiver: LocalReceiver
private lateinit var mLocalReceiver: LocalReceiver
var chatPageViewModel: ChatPageViewModel? = null
private val filePicker = FilePicker.getInstance(this) private val filePicker = FilePicker.getInstance(this)
override fun bindView() { override fun bindView() {
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_chat); mBinding = DataBindingUtil.setContentView(this, R.layout.activity_chat);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.statusBarColor = window.statusBarColor =
ContextCompat.getColor(this, com.tenlionsoft.baselib.R.color.chat_page_bg) ContextCompat.getColor(this, com.tenlionsoft.baselib.R.color.chat_page_bg)
val fromId = intent.getStringExtra("fromId")
chatPageViewModel = ViewModelProvider(this, object : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return ChatPageViewModel(fromId!!, SpUtils.getId()) as T
}
})[ChatPageViewModel::class.java]
mBinding.ivBack.setOnClickListener { finish(); } mBinding.ivBack.setOnClickListener { finish(); }
mBinding.srlChats.setEnableRefresh(false) mBinding.srlChats.setEnableRefresh(false)
mBinding.srlChats.setEnableLoadMore(false) mBinding.srlChats.setEnableLoadMore(false)
@ -44,20 +53,20 @@ class ChatActivity : BaseActivity() {
mBinding.etMsg.append(it.emoji) mBinding.etMsg.append(it.emoji)
} }
//显示/隐藏软键盘 //显示/隐藏软键盘
chatPageViewModel.showSoftKeyboard.observe(this) { chatPageViewModel!!.showSoftKeyboard.observe(this) {
if (it) { if (it) {
showSoftKeyBoard(mBinding.etMsg) showSoftKeyBoard(mBinding.etMsg)
chatPageViewModel.showChooseLayout.value = false chatPageViewModel!!.showChooseLayout.value = false
chatPageViewModel.showEmojiLayout.value = false chatPageViewModel!!.showEmojiLayout.value = false
chatPageViewModel.showReplyLayout.value = false chatPageViewModel!!.showReplyLayout.value = false
} else { } else {
hideSoftKeyboard() hideSoftKeyboard()
} }
} }
mBinding.rlContent.setOnClickListener { mBinding.rlContent.setOnClickListener {
chatPageViewModel.showChooseLayout.value = false chatPageViewModel!!.showChooseLayout.value = false
chatPageViewModel.showEmojiLayout.value = false chatPageViewModel!!.showEmojiLayout.value = false
chatPageViewModel.showReplyLayout.value = false chatPageViewModel!!.showReplyLayout.value = false
hideSoftKeyboard() hideSoftKeyboard()
} }
mBinding.wvView.setTextSize(14F, isSp = true) mBinding.wvView.setTextSize(14F, isSp = true)
@ -67,21 +76,20 @@ class ChatActivity : BaseActivity() {
mBinding.etMsg.setText(data.toString()) mBinding.etMsg.setText(data.toString())
} }
}) })
chatPageViewModel.chooseType.observe(this) { chatPageViewModel!!.chooseType.observe(this) {
when (it) { when (it) {
PickerType.TYPE_PIC -> { PickerType.TYPE_PIC -> {
filePicker filePicker.pickMultiImage { list ->
.pickMultiImage { list -> if (list.isNotEmpty()) {
if (list.isNotEmpty()) { chatPageViewModel!!.uploadImages(list)
chatPageViewModel.uploadImages(list)
}
} }
}
} }
PickerType.TYPE_VIDEO -> { PickerType.TYPE_VIDEO -> {
filePicker.pickVideo { mate -> filePicker.pickVideo { mate ->
if (mate != null) { if (mate != null) {
chatPageViewModel.uploadVideo(mate) chatPageViewModel!!.uploadVideo(mate)
} }
} }
} }
@ -89,7 +97,7 @@ class ChatActivity : BaseActivity() {
PickerType.TYPE_FILE -> { PickerType.TYPE_FILE -> {
filePicker.pickFile { meta -> filePicker.pickFile { meta ->
if (meta != null) { if (meta != null) {
chatPageViewModel.uploadFiles(meta) chatPageViewModel!!.uploadFiles(meta)
} }
} }
} }
@ -97,10 +105,17 @@ class ChatActivity : BaseActivity() {
else -> {} else -> {}
} }
} }
chatPageViewModel!!.scrollListToBottom.observe(this) {
if (it) {
mBinding.rlvChats.scrollToPosition(chatPageViewModel!!.adapter.list.size - 1)//滚动到底部
chatPageViewModel!!.scrollListToBottom.value = false
}
}
registerLocalReceiver() registerLocalReceiver()
} }
@SuppressLint("UnspecifiedRegisterReceiverFlag")
private fun registerLocalReceiver() { private fun registerLocalReceiver() {
mLocalReceiver = LocalReceiver() mLocalReceiver = LocalReceiver()
val intentFilter = IntentFilter() val intentFilter = IntentFilter()
@ -123,7 +138,7 @@ class ChatActivity : BaseActivity() {
ProjectConfig.A_S_MSG_RECEIVER -> { ProjectConfig.A_S_MSG_RECEIVER -> {
val msg = intent.getStringExtra("msg") val msg = intent.getStringExtra("msg")
Log.e("LocalReceiver", "onReceive: ${msg}") Log.e("LocalReceiver", "onReceive: ${msg}")
chatPageViewModel.receiveMsg(msg) chatPageViewModel!!.receiveMsg(msg)
}//接收到信息 }//接收到信息
} }
} }

View File

@ -27,19 +27,33 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
class ChatPageViewModel : BaseViewModel() { class ChatPageViewModel(private val fromId: String, private val toId: String) : BaseViewModel() {
val txtMsg = MutableLiveData<String>("") val txtMsg = MutableLiveData<String>("")
val showSendBtn = MutableLiveData(false)//显示/隐藏发送按钮 val showSendBtn = MutableLiveData(false)//显示/隐藏发送按钮
val showEmojiLayout = MutableLiveData(false)//显示/隐藏emoji val showEmojiLayout = MutableLiveData(false)//显示/隐藏emoji
val showReplyLayout = MutableLiveData(false)//显示/隐藏快速回复 val showReplyLayout = MutableLiveData(false)//显示/隐藏快速回复
val showChooseLayout = MutableLiveData(false)//显示/隐藏选择 val showChooseLayout = MutableLiveData(false)//显示/隐藏选择
val chooseType = MutableLiveData<PickerType>()//选择文件类型 val chooseType = MutableLiveData<PickerType>()//选择文件类型
val scrollListToBottom = MutableLiveData<Boolean>(false)
private val _msgList = MutableLiveData<List<MsgBean>>() private val _msgList = MutableLiveData<List<MsgBean>>()
var adapter: ChatMsgAdapter = ChatMsgAdapter(_msgList.value ?: emptyList(),this) var adapter: ChatMsgAdapter = ChatMsgAdapter(_msgList.value ?: emptyList(), this)
private val mGson: Gson = Gson() private val mGson: Gson = Gson()
init { init {
Log.e("ChatPageViewModel", "Init: ${showSendBtn.value}") Log.e("ChatPageViewModel", "Init: ${showSendBtn.value}")
viewModelScope.launch {
val list = getList()
adapter.setData(list)
}
}
//获取列表
private suspend fun getList(): List<MsgBean> {
return withContext(Dispatchers.IO) {
val msgDao = DbManager.db.msgDao()
return@withContext msgDao.getMsgByFromOrToPage(fromId, toId)
}
} }
fun onTxtChange(s: CharSequence, start: Int, before: Int, count: Int) { fun onTxtChange(s: CharSequence, start: Int, before: Int, count: Int) {
@ -179,7 +193,7 @@ class ChatPageViewModel : BaseViewModel() {
} }
} }
//刷新列表 //刷新列表
scrollListToBottom.value = true
Log.e("ChatPageViewModel", "receiveMsg接收到消息: ${bean.msgBean}") Log.e("ChatPageViewModel", "receiveMsg接收到消息: ${bean.msgBean}")
} }
} }