간단한 연락처 앱 화면 구현

kkomin·2023년 8월 28일
0

Android Studio

목록 보기
17/44
post-thumbnail

viewType이 2개인 MultiViewType을 이용해 연락처 앱 화면을 구현할 것이다.

♻️ 레이아웃에 RecyclerView 설정


📜 레이아웃 설정

즐겨찾기가 되지 않은 기본 item_recycle.xml 레이아웃을 생성하고 반복할 항목의 UI를 설정해준다.

즐겨찾기가 된 item_recycle_favorite.xml 레이아웃을 생성하고 반복할 항목의 UI를 설정해준다. item_recycle.xml과의 차이점으로는 별이 채워진 image의 차이이다.


📚 데이터 클래스 생성

사진, 이름, 전화번호는 String으로 설정하고, 즐겨찾기 여부에 따라 viewType이 변경되기 때문에 viewType는 0 또는 1로 설정해줬기 때문에 Int형으로 설정해주었다.


🖇️ Adapter 클래스 정의

앞에서 정의했던 데이터 클래스의 MyItem 타입의 객체들을 ArrayList로 관리하는 Myadater 클래스로 RecyclerView.Adapter을 파생해서 정의한다.

즐겨찾기 여부에 따른 viewHolder도 정의해주면 된다. 앞서 즐겨찾기가 되지 않은 평범한 항목들은 TYPE_NORMAL로 설정해줄 것이고 즐겨찾기가 된 항목들은 TYPE_SPECIAL로 설정해줄 것이다.

onCreateViewHolder를 설정해주면 된다. TYPE_NORMAL일 경우에는 item_recycle 레이아웃을 사용하도록, TYPE_SPECIAL일 경우에는 item_recycle_favorite 레이아웃을 사용하도록 설정해주면 된다.

item의 갯수를 반환하고 선택한 viewType을 반환하는 함수들을 정의해해준다.

onBindViewHolder을 이용해 선택한 아이템의 타입이 TYPE_NORMAL인 경우에는 viewHolder를 NormalHolder로 캐스팅하고 data binding 해준다.

여기서 setIsRecyclable를 이용하면 해당 viewHolder가 재활용되지 않도록 설정해 data binding 이 중복되거나 잘못되는 것을 방지한다.

선택한 아이템의 타입이 SPECIAL_TYPE인 경우에는 viewHolder를 SpecalHolder로 캐스팅하고 data binding을 해주고, 해당 SpecialHolder가 재활용되지 않도록 설정해 data binding이 중복되거나 잘못되는 것을 방지한다.

inner class를 이용해서 NormalHolder를 정의해주고 bind 함수를 정의해주면 된다.

inner class를 이용해서 SpecialHolder를 정의해주고 bind 함수를 정의해주면 된다.


🐣 MainActivity 정의

MainActivity에는 데이터 원본을 추가하고 RecyclerView에 어댑터를 설정해준 뒤, LinerLayoutManager를 설정해 RcyclerView에 layoutManager을 설정해주면 된다 !


📺 실행 결과


💻 추가 구현

제대로 잘 작동하는데 뭔가 즐겨찾기가 된 항목들은 상단에 배치되고 하단에는 즐겨찾기가 되지 않은 항목드로 구현된 것이 좋을 것 같아 코드를 추가해줬다.

init을 이용해 TYPE_NORMAL을 상단으로, TYPE_NORMAL을 하단으로 설정하는 올림차순 정렬을 해주고, 원본리스트를 비우고 정렬된 리스트로 채워주면 된다.

아래와는 같은 코드이다. sortedByDescending을 이용해 즐겨찾기가 된 항목들을 올림차순으로 정렬했다.

  init {
      val sortedList = mItems.sortedByDescending { it.type == TYPE_SECIAL }
      mItems.clear()
      mItems.addAll(sortedList)
  }

📺 추가 구현 실행 결과


그러면 이제 진짜로 끝!! MultiView를 처음 사용해봐서 많이 헷갈려서 구현하는데 시간이 많이 걸렸다...!!! 그래도 RecyclerView에 좀 더 알아간 것 같아서 완전 뿌듯하다 😗

profile
소소한 코딩 일기

0개의 댓글