Apple is Apple

일일 회고

 

어제 과제 기능 구현한 것을 오늘 다시 돌려보았는데 치명적?인 버그를 발견하였다!

 

궁리 끝에 답을 찾아내었다. 머리로는 찾았는데 코드를 치다보니 시행착오가 있었다. 

 

하지만 결국! 고쳤다!  근데 그 답이 맞는 답? 좋은 답? 인지는 모르겠다.

 

그래도 일단 머리 싸맨 보람은 있었으니 기분은 아주 좋았다. 


오늘의 키워드

  • 알고리즘
  • 숙련 개인 과제 정리

알고리즘

 

[programmers] [Kotlin] 부족한 금액 계산하기

문제 설명 새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉

aaapple.tistory.com

숙련 개인 과제 정리

 

GitHub - Kim-Min-Jong/nbcamp_android_skilled: 내일배움캠프 안드로이드 숙련 개인과제

내일배움캠프 안드로이드 숙련 개인과제. Contribute to Kim-Min-Jong/nbcamp_android_skilled development by creating an account on GitHub.

github.com

Level1

Target SDK - 33으로 진행

  • 상단 툴바를 제거하고 풀스크린 화면으로 세팅해주세요. (statusbar는 남기고)
  • RecyclerViewer를 이용해 리스트 화면을 만들어주세요.
  • 상품 이미지는 모서리를 라운드 처리해주세요.
  • 상품 이름은 최대 두 줄이고, 그래도 넘어가면 뒷부분에 …으로 처리해 주세요.
    • Constraint Layout으로 최대한 동일하게 함, NoActionBar 사용, TextView-maxLine=2로 지정함
    • 둥근 모서리는 drawable에 shape을 통해 배경을 만든 후, imageView의 clipToLine속성을 true로 하여 적용
  • 상품 데이터는 아래 dummy data를 사용합니다. (더미 데이터는 자유롭게 추가 및 수정 가능)
    • 데이터 전용 클래스를 생성하여 더미데이터 관리 - ProductsData class
  • 뒤로 가기(BACK)버튼 클릭시 종료하시겠습니까? [확인][취소] 다이얼로그를 띄워주세요. 
    • API 33(TIRAMISU) 버전 이상뒤로가기 버튼 클릭 시 불리는 콜백함수인 onBackPressed가 deprecated 되어 onBackPressedDispatcher 적용, 33 이하 버전 대응도 위해 onBackPressed도 구현해 놓음
  • 상단 종모양 아이콘을 누르면 Notification을 생성해 주세요.
    • ProductNotification class에서 notification 채널(API 26 이상 필수)과 notification 실행 함수를 만들어 notification을 구현 (API 33 이상에서는 notification 시 권한 설정이 필수라 권한 요청 로직도 작성)
  • 상품 가격은 1000 단위로 콤마(,) 처리해 주세요.
    • Decimal Format 클래스를 활용하여 해결
  • 상품 선택 시 아래 상품 상세 페이지로 이동합니다.
  • 상품 상세페이지 이동시 intent로 객체를 전달합니다. (Parcelize 사용)
    • RecylclerView의 클릭리스너를 직접 구현하여 Adapter에 부착하여 사용 (interface로 틀 생성 후 구현)
    • kotlin-parcelize 플러그인을 통하여 간결하게 구현

Level2

  • 하단 가격표시 레이아웃을 제외하고 전체화면은 스크롤이 되어야 합니다. 
    • Constraint Layout과 ScrollView를 통해서 최대한 비슷하게 구현
    • Constraint Layout을 구성할 때, 하단 가격 표시 레이아웃을 고정시켜 놓고, 그 윗 영역에만 ScrollView를 적용
  • 메인화면에서 전달받은 데이터로 판매자, 주소, 아이템, 글내용, 가격등을 화면에 표시합니다.
    • RecyclerView Adapter의 ViewHolder에서 받아온 데이터를 바인딩 시킴
  • 상단 < 버튼을 누르면 상세 화면은 종료되고 메인화면으로 돌아갑니다.
    • ImageButton을 만들어 ScrollView와 관계없이 좌측 상단에 고정

선택과제 

1. 리사이클러뷰 스크롤 상단 이동

  • 최상단으로 이동하는 플로팅버튼, 최상단일 때는 보이고, 그 이외에는 보이지 않게 하기, 이때 fade-in, out 효과 부여, 버튼 클릭 시 아이콘 색 변경
    • 최상단일 때 플로팅 버튼 유무 기능은 RecyclerView의 OnScrollListener의 OnScrolled메서드를 통해 제어
    • OnScrolled 메서드는 RecyclerView가 스크롤될 때마다 호출됨
    • OnScrolled 메서드 안에서 if(RecyclerView.canScrollVertically(-1)))를 통해 버튼의 유무를 조정
    • canScrollVertically(-1)!= true이면 RecyclerView의 최상단이 감지되었다는 뜻, 인자가 1이면 최하단
    • if절 내에서 fade-in, out 애니메이션을 적용하고, 플로팅 버튼의 visibility를 제어

2. 리사이클러뷰 상품 삭제하기

  • 상품을 길게 눌렀을 때, 다이얼로그를 띄우고 확인을 누를 시 삭제하고 리사이클러뷰 업데이트
    • 위에서 구현한 클릭 리스너 interface에 LongClick시 실행 될 메서드 추가
    • Adapter의 ViewHolder에서 setOnLongClickListener를 통해 클릭 리스너 구현
    • Adapter에서 LongClick 됐을 때 불릴, removeItem메서드 구현 - 특정 position에 있는 데이터를 삭제하고 notifyDataRemoved(position)을 통해 리사이클러뷰를 업데이트
    • MainActivity에서는 interface로 만든 리스너 틀을 실제로 구현시켜 완성

3. 관심 등록하기

  • 상품 상세화면에서 좋아요 버튼 클릭 시 아이콘 변경, 스낵바 표시
  • 메인 리사이클러뷰로 돌아오면 좋아요 한 상품에 좋아요 아이콘 표시 및 좋아요 카운트 증가
  • 좋아요 해제 시 리사이클러뷰에서도 해제
    • 기존엔 메인 -> 상세 화면 넘어갈 때 startActivity를 사용했는데 이것은 새로운 액티비티 인스턴스를 만드는 거라 두 액티비티 사이의 생명주기 조절과 데이터 교환 및 액티비티가 계속 쌓이는 문제로, registerForAcitivityResult를 통해 생명주기 관리와 데이터 교환 등이 용이하도록 변경
    • 상세화면에서 좋아요를 누르면 intent와 setResult를 통해 상세화면 물품의 id값과 좋아요 수를 메인으로 보냄
    • 메인으로 나오면 registerForAcitivityResult로 구현해 놓은 activityLauncher에서 id와 좋아요 여부(T, F)를 받고 RecyclerView Adapter로 보내 리사이클러 뷰를 업데이트 시킴
    • adapter에 updateItem(id: Int, isChecked: Boolean) 메서드를 구현함
    • updateItem에서는 id값으로 상품 데이터들 중에서 id값인 데이터를 찾음
    • 찾은 데이터의 isliked 값을 isChecked로 갱신함
    • isChecked가 true면 좋아요 수를 1 증가 시킴, false면 1 감소 시킴
  • 위 과정까지 하고 버그 발견(2023/08/24/ 15:30) --> 2023/08/24 16:40 수정완료
  • 리사이클러뷰 아이템 추가 수정 (2023/8/30 업데이트)
 

내일배움캠프 7기 Android TIL 33일차 (2023.08.30)

일일 회고 오늘은 과제 수정을 위주로 진행해보았다. 내가 짠 코드를 쭉 돌아보면서 하드코딩되있는 부분이 있는 지, 일전에 수정을 생각해둔 부분이 있었는 지를 확인하였다. 그러면서 RecyclerVi

aaapple.tistory.com

Trouble Shooting

버그 종류 - 좋아요 아이콘을 한 번만 클릭하고, 메인 리사이클러 뷰로 오면 적용이 잘 되는데, 여러 번 클릭하여 원래상태 

( ex) 좋아요 상태에서 2번 눌러서 다시 좋아요 상태, 좋아요 x에서 4번 눌러서 좋아요 x )로 돌아오면 숫자가 1씩 더 더해지거나 1씩 더 빼진 상태

 

원인 -> 좋아요 버튼을 짝수번 누르게 되면 원래 상태로 돌아오는데(돌아오는 효과가 있는데), 내가 짜놓은 코드에서는 좋아요 버튼을 누를 때마다 intent에 true, false 값을 설정하게 된다.  ( CheckBox의 setOnCheckedChangeListener 때문에)

원래 상태이기 때문에 메인 리사이클러뷰에 와도 아무런 동작을 하지 않아야 한다. 하지만 좋아요 버튼(체크박스)을 눌렀기 때문에 데이터가 전송되어 이상현상을 발생시켰던 것이다.

 

해결 -> 결국 여러 번 클릭을 해도 짝수 번을 클릭했을 때 원래 상태로 돌아오는 효과를 적용해야 한다.(변화가 없는) 

이 효과를 주기 위해 count라는 변수를 두어 체크박스가 눌릴 때마다 1씩 더한다.

그리고 intent에 extra로 추가하여 메인 화면으로 보낸다.

 

메인에서는 데이터를 받게 되는데 이때, 받은 count 변수가 짝수일 때 updateItem 메서드를 호출하지 않는다.

 

호출하지 않음으로써 원래 상태가 유지되는 효과가 발휘된다.

 

 

Trouble Shooting 전 후 영상

 

버그 수정 전

 

버그 수정 후

 

profile

Apple is Apple

@mjjjjjj