일일 회고
어제 과제 기능 구현한 것을 오늘 다시 돌려보았는데 치명적?인 버그를 발견하였다!
궁리 끝에 답을 찾아내었다. 머리로는 찾았는데 코드를 치다보니 시행착오가 있었다.
하지만 결국! 고쳤다! 근데 그 답이 맞는 답? 좋은 답? 인지는 모르겠다.
그래도 일단 머리 싸맨 보람은 있었으니 기분은 아주 좋았다.
오늘의 키워드
- 알고리즘
- 숙련 개인 과제 정리
알고리즘
[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 전 후 영상
'내일배움캠프 7기 > TIL' 카테고리의 다른 글
내일배움캠프 7기 Android TIL 31일차 (2023.08.28) (0) | 2023.08.28 |
---|---|
내일배움캠프 7기 Android TIL 30일차 (2023.08.25) (0) | 2023.08.25 |
내일배움캠프 7기 Android TIL 28일차 (2023.08.23) (0) | 2023.08.23 |
내일배움캠프 7기 Android TIL 27일차 (2023.08.22) (0) | 2023.08.22 |
내일배움캠프 7기 Android TIL 26일차 (2023.08.21) (0) | 2023.08.21 |