상세 컨텐츠

본문 제목

[안드로이드 코틀린] 채팅앱 만드는 방법 part9 - 메시지 가져오기

안드로이드

by aries574 2022. 10. 28. 17:58

본문


이번 시간에는 채팅앱 마지막 시간

전송한 메시지 화면보여주는 방법 알아보겠습니다.

이전 포스팅은 아래 링크를 들어가시면 됩니다.

2022.10.27 - [안드로이드] - [안드로이드 코틀린] 채팅앱 만드는 방법 part8 - 메시지 보내기

 

[안드로이드 코틀린] 채팅앱 만드는 방법 part8 - 메시지 보내기

이번 시간에는 채팅앱 만들기 여덟 번째 시간 메시지 보내는 방법에 대하여 알아보겠습니다. 이전 포스팅은 아래 링크를 들어가시면 됩니다. 2022.10.26 - [안드로이드] - [안드로이드 코틀린] 채팅

aries574.tistory.com


목차

1. 실행 화면
2. 받는 메시지 화면 receive.xml
3. 보낸 메시지 화면 send.xml
4. 메시지 어댑터 MessageAdapter.kt
5. 채팅 ChatActivity.kt


1. 실행 화면

 

2. 받는 메시지 화면 receive.xml

- 설명 -

 1. 받은 메시지 보여주는 TextView

2022.01.01 - [안드로이드] - [안드로이드 스튜디오] 레이아웃 추가하는 방법

 

[안드로이드 스튜디오] 레이아웃 추가하는 방법

이번 시간에는 안드로이드 스튜디오에서 레이아웃 추가하는 방법을 알아보겠습니다. 안드로이드 프로젝트를 만들면 java폴더에는 MainActivity 파일이 있고, res -> layout 폴더에는 activity_main.xml 파일

aries574.tistory.com

<?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>

 


3. 보낸 메시지 화면 send.xml

- 설명 -

 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>

 

반응형


4. 메시지 어댑터 MessageAdapter.kt

- 설명 -

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

 


5. 채팅 ChatActivity.kt

- 설명 -

 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

 

[안드로이드] Firebase Storage 이미지 업로드 part1

이번 시간에는 Firebase를 통해서 이미지를 업로드하는 방법을 알아보겠습니다. 간단하게 설명하자면 Firebase의 Storage에 이미지를 업로드하고, 이미지가 저장된 주소를 Realtime Database에 저장합니다.

aries574.tistory.com

 

2022.03.09 - [안드로이드] - [안드로이드] Firebase 시작하기 실시간 데이터베이스 Realtime Database (간단한 데이터 읽기, 쓰기) part1

 

[안드로이드] Firebase 시작하기 실시간 데이터베이스 Realtime Database (간단한 데이터 읽기, 쓰기) part

이번 시간에는 Firebase를 통해 데이터베이스에 간단한 데이터를 쓰고 읽는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 프로젝트 만들기 3. 앱 만들기 4. 데이터 베이스 만들기 5. 라이브러

aries574.tistory.com

2022.03.19 - [안드로이드] - [안드로이드] 간단한 할 일 목록(ToDoList) 쉽게 만드는 방법

 

[안드로이드] 간단한 할 일 목록(ToDoList) 쉽게 만드는 방법

이번 시간에는 간단한 할 일 목록(ToDoList) 만드는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 아이템 화면 만들기 3. 메인 화면 구성 activity_main.xml 4. 메인 코드 구현 MainActivity.java 1. 실행 화면..

aries574.tistory.com

 

반응형

관련글 더보기

댓글 영역