운기의 블로그
#5. 나만의 메모장 만들기 / Database에 저장된 내용 리사이클러뷰에 바로 update 하기 / 리사이클러뷰 아이템 삭제 및 ROOM, 로컬DB에서 삭제하기 / JAVA 본문
#5. 나만의 메모장 만들기 / Database에 저장된 내용 리사이클러뷰에 바로 update 하기 / 리사이클러뷰 아이템 삭제 및 ROOM, 로컬DB에서 삭제하기 / JAVA
운띠야 2020. 3. 30. 04:10저번에 로컬DB에 데이터 내용을 저장하고 리사이클러 뷰에 뿌려주기를 했는데 생각과 다르게 바로 리사이클러뷰에 보이는게 아니라 앱을 종료시켰다가 들어와야지 업데이트가 되는 문제가 생겼습니다.
이 문제를 어떻게 해결 할까 고민 하다가 startActivityForResult 사용하여 결과값을 저장하여 반환해주는 방식을 택했습니다.
1. 로컬 DB에 저장하는 방식 변경
List<User> users 만들어서 로컬 DB에 저장되어 있는 값을 불러옵니다.
기존의 방식은 계속해서 DB에 접근해서 불러오는 방식이였는데, 데이터의 양이 커질 수록 오래걸리기 때문에 위에서 만들어준 List에 한 번에 담아두고 담아둔 것을 이용해서 리사이클러뷰에 담아주는 방식으로 변경했습니다.
리사이클러뷰에 담아주는 부분입니다.
담아주고나서 변경 사항을 알려주기 위해 notifyDataSetChanged()를 이용했습니다.
2. 어떻게 리사이클러뷰에 바로 업데이트를 해줄까?
#4 편에서 말하다시피 대부분의 예제는 LiveData를 이용해여 옵저빙해서 바로 바로 변화한 값을 확인하고 갱신해준다.
하지만 아직 능숙하게 다루지 못해서 사용하지 않고 작성하기 위해 많은 생각과 노력을 했다.
1) adapter를 static으로 두고 사용할까?
메인에서 리사이클러뷰에 적용시킬 껀데 메모를 저장한곳에다가 adapter를 가져가서 사용하는데에는 너무 억지스러움이 있다고 느껴서 하지 않았습니다.
2) 안드로이드의 생명주기를 이용한 방식
사용자가 본격적으로 액티비티와 상호작용이 가능하기 전에
즉 onResume() 되기전에 업데이트를 해준다면 ?! 괜찮을거 같다는 생각을 하게 되었습니다.
위의 방식을 사용하기 위해 MainActivity에서 SaveMemoActivity로 넘어 갈때
startActivityForResult를 사용해서 intent와 맨 위에 이미지를 참고하시면 SAVE_MEMO_ACTIVITY를 상수값으로 만들어서 넘겨주기로 했습니다.
3. SaveMemoActivity
MainActivity에서 넘어온 값을 받고 다시 intent에 REQUSET_CODE에 저장된 상수값과 이름을 다시 보내주고
액티비티를 종료 시킵니다.
4. MainActivity
다시 MainActivity로 돌아와서 SaveMemoActivity에서 넘겨 준값을 받기 위해서 onActivityResult 함수를 만들어 줍니다.
Main -> SaveMemo ->Main 돌아오기때문에 requsetCode값과 넘어온 resultCode 조건이 맞으면
맨 처음 만들어줬던 users List에 로컬DB에 저장되어 있던 걸 불러와서 담아주고 어뎁터에 추가시켜줍니다.
5. RecyclerAdapter
additem은 리사이클러뷰에 뿌릴 때 사용되는 함수이고
additems는 리사이클러뷰에 뿌리기전에 먼저 로컬 DB에 저장되어 있는 내용을 Adapter에 만들어진 userData에
값을 담아 갱신해주는 작업이다.
여기까지 하면 saveMemo액티비티에서 메모를 저장하고 MainActivity로 돌아오면 바로 리사이클러뷰에 갱신된 메모를 볼 수 있을 것입니다!!
6. 리사이클러뷰 삭제 및 로컬DB 삭제
마지막으로 삭제 부분인데 Adapter 바인드에서 구현해 주면 됩니다.
저는 리사이클러뷰를 아래 그림과 같이 구현했습니다.
빨간색, 초록색,파란색은 TextView / 노란색은 ImageView입니다.
여기서 개개인을 클릭해서 지워도 되지만 저는 이 모든 view를 감싸고 있는 검은색 view를 클릭했다고
하고 지울 생각입니다.
그래서 가장 큰 테투리에 있는 view는 onBind 내에 itemView이고
이 itemView를 길게 클릭했을 때, userData안에 user객체에 대한 정보를 삭제하고
로컬DB의 해당 user 객체를 지우고 변경사항을 알려주면
아래의 이미지 처럼됩니다.
해당 객체가 삭제되면 번호도 자동으로 바뀌면서 메모를 관리 할 수 있게 됩니다.
요번에 새로 커밋한 내용입니다.
기존에 코드에서 변경된 부분이 있으니까 참고하실분은 참고해주시기 바랍니다!
https://github.com/leewoongi/MemoPad/commit/1e4392b283b57b683b0bffad494bf65101865bae
'안드로이드' 카테고리의 다른 글
자바로 keyHash 구하는 소스 (0) | 2020.05.14 |
---|---|
#6. 나만의 메모장 만들기 메모 클릭 시 작성된 메모 보기 / 메모 수정 / 메모 ROOM UPDATE / JAVA로 구현 (0) | 2020.04.07 |
#4. 나만의 메모장 만들기 / Database에 저장된 내용 리사이클러뷰에 넣기 / Dialog + editText (0) | 2020.03.17 |
#3. 나만의 메모장 만들기 / ROOM error: AppDatabase() has private access in AppDatabase 문제 해결 / 싱글톤 (0) | 2020.03.07 |
#2. 나만의 메모장 만들기 UI (0) | 2020.02.28 |