관리 메뉴

hyeals study

인스타그램 클론 (알람 리스트 페이지) 본문

안드로이드

인스타그램 클론 (알람 리스트 페이지)

hyeals 2020. 4. 15. 20:52

- 알림 메세지를 띄워주는 기능 추가

 

[1] fragment_alarm.xml로 이동해서 아래와 같이 레이아웃을 만듦

 

fragment_alarm.xml

 


[2] AlarmFragment로 이동해서 RecyclerViewAdapter를 만듦 (여기서는 AlarmRecyclerviewAdpater)

 

- 아래와 같이 inner클래스로 AlarmRecyclerviewAdpater 클래스를 만들어줌

 

inner class AlarmRecyclerviewAdpater : RecyclerView.Adapter<RecyclerView.ViewHolder>(){

        var alarmDTOList: ArrayList<AlarmDTO> = arrayListOf()

        init{
            val uid = FirebaseAuth.getInstance().currentUser?.uid

            FirebaseFirestore.getInstance().collection("alarms").whereEqualTo("destinationUid", uid)
                .addSnapshotListener { querySnapshot, firebaseFirestoreException ->

                    alarmDTOList.clear()

                    if(querySnapshot == null) return@addSnapshotListener

                    for (snapshot in querySnapshot.documents) {
                        alarmDTOList.add(snapshot.toObject(AlarmDTO::class.java)!!)
                    }

                    alarmDTOList.sortByDescending { it.timestamp }

                    notifyDataSetChanged()
                }
        }

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
            var view = LayoutInflater.from(parent.context).inflate(R.layout.item_comment,parent,false)

            return CustomViewHolder(view)
        }

        inner class CustomViewHolder(view: View): RecyclerView.ViewHolder(view)

        override fun getItemCount(): Int {
           return alarmDTOList.size
        }

        override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
            var view = holder.itemView

            FirebaseFirestore.getInstance().collection("profileImages").document(alarmDTOList[position].uid!!).get().addOnCompleteListener { task ->
                if(task.isSuccessful){
                    val url = task.result!!["image"]
                    Glide.with(view.context).load(url).apply(RequestOptions().circleCrop()).into(view.commentviewitem_imageview_profile)
                }
            }

            when(alarmDTOList[position].kind){

                0 -> {
                    val str_0 = alarmDTOList[position].userId + getString(R.string.alarm_favorite)
                    view.commentviewitem_textview_profile.text = str_0
                }

                1 -> {
                    val str_0 = alarmDTOList[position].userId + " " + getString(R.string.alarm_comment) + " of " + alarmDTOList[position].message
                    view.commentviewitem_textview_profile.text = str_0
                }

                2 -> {
                    val str_0 = alarmDTOList[position].userId + " " + getString(R.string.alarm_follow)
                    view.commentviewitem_textview_profile.text = str_0
                }
            }
            view.commentviewitem_textview_comment.visibility = View.INVISIBLE
        }
    }

 

[ 코드 설명 ] 

 

 

- 알람을 저장하는 리스트 변수


 

- 아이템 디자인을 불러옴 (여기서 item_commet.xml 디자인을 재활용함)


 

- 종류에 따라 메세지를 다르게 표시할 수 있도록 하는 코드를 추가함

 

- userId: 누가 좋아요를 눌렀는지, 누가 댓글을 달았는지, 누가 팔로우를 했는지

 

  1. kind=0: 좋아요 알람 리스트
  2. kind=1: 댓글 알람
  3. kind=2: 팔로우 알람

 

- 어댑터가 생성될 때 데이터베이스를 읽어오도록 하는 부분

 

- destinationUid가 현재 사용자인 경우의 정보들(메세지들)만 필터링

 

- 필터링한 데이터들을 스냅샷을 이용해서 데이터베이스로부터 AlarmDTO로 캐스팅해서 alarmDTOList에 추가함

 

- notifyDataSetChanged(): Recyclerview를 새로고침해줌


 

- 어댑터와 recyclerview를 연결시키고, recyclerview를 어느 방향으로 배치시킬지 LinearLayoutManager를 통해 정함 (여기서는 세로로 배치함)


 

- 데이터 베이스의 profileImages에 접근한 후, 댓글을 단 상대방의 uid를 document에 넣어서 상대방 프로필 이미지 주소를 받아옴

 

- 얻어온 값Glide를 이용해서 다운로드함


[3] 프로젝트를 실행시킨 후 아래에 하트 모양 아이콘을 누르면 알람 리스트를 확인할 수 있음

 

 

 

자세한 내용은 인프런 하울의 안드로이드 인스타그램 클론 만들기 강의를 참고

 

 

 

 

 

'안드로이드' 카테고리의 다른 글

webView 사용해보기  (0) 2020.05.11
RecyclerView 사용법  (0) 2020.05.11
인스타그램 클론 (알림 이벤트)  (0) 2020.04.14
인스타그램 클론 (댓글 페이지)  (0) 2020.04.13
인스타그램 클론 (사진 페이지)  (0) 2020.04.10
Comments