이번 시간에는 채팅앱 마지막 시간
전송한 메시지 화면에 보여주는 방법 알아보겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.10.27 - [안드로이드] - [안드로이드 코틀린] 채팅앱 만드는 방법 part8 - 메시지 보내기
- 설명 -
1. 받은 메시지 보여주는 TextView
2022.01.01 - [안드로이드] - [안드로이드 스튜디오] 레이아웃 추가하는 방법
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/receive_message_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_margin="5dp"
android:background="@drawable/edit_background"
android:padding="10dp"
android:text="받는 메시지"
android:textSize="18sp" />
</RelativeLayout>
- 설명 -
1. 보낸 메시지 보여주는 TextView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/send_message_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_margin="5dp"
android:background="@drawable/btn_background"
android:padding="10dp"
android:text="보내는 메시지"
android:textColor="@android:color/white"
android:textSize="18sp" />
</RelativeLayout>
- 설명 -
1. SentViewHolder
보낸 쪽 ViewHolder
2. ReceiveViewHolder
받는 쪽 ViewHolder
3. getItemViewType
ViewHolder 타입 리턴하는 함수
4. onCreateViewHolder
화면 연결해주는 함수
5. onBindViewHolder
데이터 연결해주는 함수
class MessageAdapter(private val context: Context, private val messageList: ArrayList<Message>):
RecyclerView.Adapter<RecyclerView.ViewHolder>(){
private val receive = 1 //받는 타입
private val send = 2 //보내는 타입
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return if(viewType == 1){ //받는 화면
val view: View = LayoutInflater.from(context).inflate(R.layout.receive, parent, false)
ReceiveViewHolder(view)
}else{ //보내는 화면
val view: View = LayoutInflater.from(context).inflate(R.layout.send, parent, false)
SendViewHolder(view)
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
//현재 메시지
val currentMessage = messageList[position]
//보내는 데이터
if(holder.javaClass == SendViewHolder::class.java){
val viewHolder = holder as SendViewHolder
viewHolder.sendMessage.text = currentMessage.message
}else{//받는 데이터
val viewHolder = holder as ReceiveViewHolder
viewHolder.receiveMessage.text = currentMessage.message
}
}
override fun getItemCount(): Int {
return messageList.size
}
override fun getItemViewType(position: Int): Int {
//메시지값
val currentMessage = messageList[position]
return if(FirebaseAuth.getInstance().currentUser?.uid.equals(currentMessage.sendId)){
send
}else{
receive
}
}
//보낸 쪽
class SendViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
val sendMessage: TextView = itemView.findViewById(R.id.send_message_text)
}
//받는 쪽
class ReceiveViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
val receiveMessage: TextView = itemView.findViewById(R.id.receive_message_text)
}
}
- 설명 -
1. addValueEventListener
데이터 추가 리스너
onDataChange 함수 통해 데이터 변화 감지
class ChatActivity : AppCompatActivity() {
private lateinit var receiverName: String
private lateinit var receiverUid: String
//바인딩 객체
private lateinit var binding: ActivityChatBinding
lateinit var mAuth: FirebaseAuth //인증 객체
lateinit var mDbRef: DatabaseReference//DB 객체
private lateinit var receiverRoom: String //받는 대화방
private lateinit var senderRoom: String //보낸 대화방
private lateinit var messageList: ArrayList<Message>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityChatBinding.inflate(layoutInflater)
setContentView(binding.root)
//초기화
messageList = ArrayList()
val messageAdapter: MessageAdapter = MessageAdapter(this, messageList)
//RecyclerView
binding.chatRecyclerView.layoutManager = LinearLayoutManager(this)
binding.chatRecyclerView.adapter = messageAdapter
//넘어온 데이터 변수에 담기
receiverName = intent.getStringExtra("name").toString()
receiverUid = intent.getStringExtra("uId").toString()
mAuth = FirebaseAuth.getInstance()
mDbRef = FirebaseDatabase.getInstance().reference
//접속자 uId
val senderUid = mAuth.currentUser?.uid
//보낸이방
senderRoom = receiverUid + senderUid
//받는이방
receiverRoom = senderUid + receiverUid
//액션바에 상대방 이름 보여주기
supportActionBar?.title = receiverName
//메시지 전송 버튼 이벤트
binding.sendBtn.setOnClickListener {
val message = binding.messageEdit.text.toString()
val messageObject = Message(message, senderUid)
//데이터 저장
mDbRef.child("chats").child(senderRoom).child("messages").push()
.setValue(messageObject).addOnSuccessListener {
//저장 성공하면
mDbRef.child("chats").child(receiverRoom).child("messages").push()
.setValue(messageObject)
}
//입력값 초기화
binding.messageEdit.setText("")
}
//메시지 가져오기
mDbRef.child("chats").child(senderRoom).child("messages")
.addValueEventListener(object: ValueEventListener{
override fun onDataChange(snapshot: DataSnapshot) {
messageList.clear()
for(postSnapshat in snapshot.children){
val message = postSnapshat.getValue(Message::class.java)
messageList.add(message!!)
}
//적용
messageAdapter.notifyDataSetChanged()
}
override fun onCancelled(error: DatabaseError) {
}
})
}
}
2022.03.16 - [안드로이드] - [안드로이드] Firebase Storage 이미지 업로드 part1
2022.03.09 - [안드로이드] - [안드로이드] Firebase 시작하기 실시간 데이터베이스 Realtime Database (간단한 데이터 읽기, 쓰기) part1
2022.03.19 - [안드로이드] - [안드로이드] 간단한 할 일 목록(ToDoList) 쉽게 만드는 방법
[안드로이드 코틀린] 파이어베이스 사용자 CRUD 만드는 방법 part2 - 사용자 등록 (0) | 2022.11.08 |
---|---|
[안드로이드 코틀린] 파이어베이스 사용자 CRUD 만드는 방법 part1 - 프로젝트 생성 (0) | 2022.11.07 |
[안드로이드 코틀린] 채팅앱 만드는 방법 part8 - 메시지 보내기 (0) | 2022.10.27 |
[안드로이드 코틀린] 채팅앱 만드는 방법 part7 - 채팅 액티비티 (0) | 2022.10.26 |
[안드로이드 코틀린] 채팅앱 만드는 방법 part6 - Firebase 메뉴 생성 및 로그아웃 (2) | 2022.10.25 |
댓글 영역