3rd Development Log

MorganKim·2021년 9월 28일
0

SSAC

목록 보기
3/9

3주차 과제

✅ ListView 를 스크롤 했을 때 왜 switch 가 풀리는 현상이 발생하는지 원인 분석 및 해결
✅ ListView 와 RecyclerView 의 차이점 조사
✅ 구글은 왜 RecyclerView 를 밀어줄까? 어떤 장점 때문에? 어떤 차이점이 있을까?
✅ RecyclerView 를 활용하여 기존의 앱을 클론 코딩하기 (ListView로 진행하는 것도 가능) - 배달의 민족, 쿠팡이츠, 쿠팡, 야놀자 중 선택

✔️ 실습 영상

해당 레이아웃을 똑같이 구현하기
스크롤 했을 때 메인 사진이 툴바로 접히면서 글씨만 보이게 하는 부분 디테일 구현
아래의 메뉴 리스트를 RecyclerView 로 구축 - 클릭했을 때 액티비티 이동, 길게 눌렀을 때 수정 등의 기능을 입히는 방식으로 과제 진행
ListView 에 CRUD 적용, 목록 클릭했을 때 데이터를 전달하면서 액티비티 혹은 프래그먼트 화면 전환하는 부분은 반드시 구현
(Challenge) 길게 눌러서 혹은 스와이프 했을 때 수정 / 삭제 버튼 뜨게 하기
(ex.카톡 채팅방 목록에서 밀었을 때 수정 / 삭제 뜨는 부분)
필터, 검색 등 다양한 기능 활용

✔️ 레퍼런스


1. ListView 를 스크롤 했을 때 왜 switch 가 풀리는 현상이 발생하는지 원인 분석 및 해결

  • switch(+ 체크 박스)
    체크 박스 에 체크하고 스크롤을 하면 체크하지 않은 체크 박스 에 체크가 되어 있는 것을 확인할 수 있다. 이와 같은 현상이 발생하는 이유는 ListView 와 RecyclerView 에서 itemView 를 재사용하기 때문인데, 아이템의 상태 값을 저장하면 해결할 수 있다.
    • SparseBooleanArray 활용
      SparseBooleanArray 는 정수 값들을 boolean 값들로 매핑시키는 기능을 하는 클래스이다. 정수 값은 RecyclerView 아이템의 position 으로 사용되고, boolean 값은 checked 여부로 사용된다.SparseBooleanArrayget() 함수를 이용해서 인자로 입력되는 position 의 상태가 checked 인지 확인할 수 있다.
    • onCheckedChangeListener() 설정
      switch 에 onCheckedChangeListener() 를 설정해서 switch 의 상태가 변할 때마다 position 의 아이템에 상태를 설정한다. 그리고 getView() 를 통해 뷰가 재사용될 때마다 해당 position 의 아이템의 switch 상태를 가져와 뷰에 표시하게 된다. 이 때 아래와 같이 설정해준 뒤 사용해야 한다.
  	holder.itemsss.setOnCheckedChangeListener(null);

2. ListView 와 RecyclerView 의 차이점 조사

  • ListView
    • 최초 생성 혹은 스크롤 할 때마다 ViewBinding 을 해서 성능저하
    • 아이템의 전체 개수가 아닌 화면에 보여지는 개수만큼만 뷰를 그려두고 재활용하는 구조로 설계됨
    • item layout 을 세로 방향만 지원
    • item animation ❌
    • item decoration Android:divider 속성을 활용하여 리스트에 있는 아이템들을 구분
    • click detection 개별 항목에 클릭 이벤트를 바인딩하기 위한 AdapterView.OnItemClickListener 인터페이스 ⭕️

  • RecyclerView
    • ViewHolder 패턴을 강제로 구현하도록 하므로 한 번만 ViewBinding 을 하게 됨, 이후 아이템을 생성해야 할 때는 바인딩 된 뷰 객체를 재활용
    • ListView 와 GridView 의 기능을 제공하여 item layout 을 가로, 세로, 사선 방향 모두 지원
    • item animation ⭕️
    • item decoration RecyclerView.ItemDecoration 객체를 활용하여 Listview 보다 많은 구분선 활용 가능
    • click detection 개별 터치 이벤트를 관리하나 클릭 처리 기능이 내장 ❌

  • cf
    • ViewBinding
      뷰와 상호작용하는 코드를 쉽게 작성하기 위해 사용한다. ViewBinding 이 활성화되면 해당 모듈에있는 각 xml 레이아웃 파일에 대한 바인딩 클래스가 자동으로 생성된다. 바인딩 클래스 인스턴스에는 해당 레이아웃에 id 가 있는 모든 뷰에 대해 직접적으로 참조된다.
    • ViewHolder
      뷰를 보관하는 객체이다. ListView 와 RecyclerView 는 inflate 를 최소화하기 위해 뷰를 재활용하는데, 이 때 성능 저하를 방지하기 위해 itemView 의 각 요소에 바로 접근할 수 있도록 저장해두고 사용하기 위해 사용한다.
    • item animation
      아이템이 추가 및 제거될 때 사용

3. 구글은 왜 RecyclerView 를 밀어줄까? 어떤 장점 때문에?

ListView 의 경우 리스트 항목이 갱신될 때마다 매번 아이템 뷰를 새로 구성하므로 많은 수의 데이터를 보여주게 되면 성능 저하를 야기한다. ViewHolder 패턴을 선택적으로 적용하여 성능 저하 문제를 해결할 수는 있지만, 말 그대로 선택적으로 적용할 수 있는 사항이고 다중 아이템 뷰를 사용해야 될 경우 코드가 매우 복잡해진다.
RecyclerView 는 아이템을 표시하기 위해 생성한 뷰를 재활용하며 기본적으로 ViewHolder 패턴을 사용하도록 한다. 이 말은 RecyclerView 에 단순히 ViewHolder 가 포함된 것을 넘어, 개발자가 직접 ViewHolder 패턴을 적용할 때 고민해야 했던 여러 이슈들이 RecyclerView 구현 사항에 고려되었다는 것을 의미한다. 이는 특히 RecyclerView 의 가장 큰 장점인 유연함에 대한 고려가 충분히 이루어졌다는 것을 의미한다.
유연함이란 프로그래밍에서 구현 요소 또는 구현에 따른 결과물이 쉽게 변경되거나 확장될 수 있음을 의미한다. 예를 들어 ListView 에서는 아이템들을 수직 방향으로만 나열할 수 있다. 만약 수평 방향으로 나열하려면 다른 뷰를 사용하거나 ListView 의 기능을 재구현해야 한다. 그리고 itemView 를 동적으로 구성하는 것 역시 쉽지 않다. itemView 를 완전히 새로운 형태로 바꾸려면 모든 상황에 대한 대응을 개발자가 직접 처리해야 한다. 하지만 RecyclerView 는 수직, 수평 모든 방향으로 아이템이 나열되게 만들 수 있고, itemViw 의 동적 구성을 용이하게 만들어주며, 이를 런타임에 바꾸게 만들 수도 있다.
따라서, 구글은 RecyclerView 의 유연함(Flexibility) 때문에 RecyclerView 사용을 권장한다고 할 수 있다.

0개의 댓글

관련 채용 정보