운기의 블로그
#4. 나만의 메모장 만들기 / Database에 저장된 내용 리사이클러뷰에 넣기 / Dialog + editText 본문
싱글톤 오류를 찾아 내고 나서 10일만에 포스팅이네요.
14일에 쏘마 시험이 있어서 그거 준비하느라 안드로이드 공부를 못했습니다.
쏘마 제발 통과시켜주세요...
어쨌든 오늘 할 내용은 로컬 데이터베이스에 저장되어 있는 내용을
리사이클러뷰에 불러와서 띄우는 작업을 하겠습니다.
그러면 시작해보겠습니다.
클래스
저번 포스팅에서 새로 생긴 클래스는 RecyclerAdapter 만 있습니다.
RecyclerView 준비단계
리사이클러뷰를 사용하고 싶으면 gradle (Module:app) 에 추가해줍니다.
androidx의 경우에는 이렇게 추가해주셔야합니다.
종속성을 추가해 주셨다면, 리사이클러뷰가 사용 될 액티비티의 xml 파일에 넣어주시면됩니다.
리사이클러뷰 안에 어떤식으로 데이터를 담는 방식은 xml 파일에서 따로 만들어줘야 하는데
저는 memorecycler_itemview에 만들어줬습니다.
( 제가 만든 방식은 아래 git 주소를 남겨놓을테니까 참조하세요 )
Recyclerview 사용하기
레이아웃에 리사이클러뷰 위젯을 추가했다면, 즉 위의 단계가 끝났다면
다음으로는 레이아웃 관리자에 추가하고 표시될 데이터의 어댑터를 연결해 줍니다.
메인에서 initialized( ) 함수를 통해서 recyclerview 객체를 찾고,
리사이클러뷰 내부에서 아이템 뷰들을 배치를 관리하기 위해 LinearLayoutManger를 생성해줍니다.
생성된 linearLayoutManger를 리사이클러뷰에 추가해줍니다.
데이터들들을 리사이클러뷰에서 어떤 뷰 안에 배치할지 바꿔주는 어댑터는
리사이클러어댑터 클래스를 만들어서 생성해주고, 어댑터 역시 리사이클러뷰에 추가해 줍니다.
Recylcerview Adapter
MainActivity에서는 로컬DB에 저장되어있는 내용을 리사이클러뷰에 띄울거기 때문에
저번에 싱글톤으로 만들었던, getInstance 함수에 userDao 인터페이스 안에 존재하는 모든 데이터를 불러오는 getAll( ) 함수를 사용해서 size를 구했고,
그 size 크기만큼 adapter에 additems 함수를 통해 내용 하나하나를 추가해줍니다.
addItems 함수를 통해서 들어온 데이터를
리사이클러어댑터 클래스에서 생성된 ArrayList에 담아 줍니다.
그리고 notifyDataSetChanged() 함수를 통해 변경된 사항이 있다는 걸 알려줍니다.
데이터를 다 담게 되면 getItemCount를 통해 현재 몇개의 데이터가 있는지 반환하게 되고,
반환된 데이터는
onBindViewHolder를 통해 데이터들을 바인드해주기 위해 onBind 함수로 들어갑니다.
이때 저는 현재 몇 번째 데이터인지를 알기 위해서
holder.onBind(userData.get(position), position )
을 매개변수로 넘겨주었습니다.
제가 만들었던 ememorecycler_itemview 레이아웃에 설정된 뷰들을 가져오고
onBind 함수를 통해서 title에는 getTitle을, description에는 getDes 접근자를 사용하여 값을 넣어 주었습니다.
그리고 key값은 위에서 매개변수로 받아온 position 값을 이용해서, 1번 부터 번호를 시작하기 위해서 +1을 해주고
string 형으로 바꿔서 textView에 넣어 줬습니다.
바인딩된 데이터는 레이아웃 관리자에 의해 호출된 onCreateViewHodler를 통해 리사이클러뷰에 채워지고,
화면에 표시되게 됩니다.
그럼 다음으로 어떤 식으로 데이터를 로컬DB에 저장하는지 확인하겠습니다.
( 코드 순서는 리사이클러뷰가 작동하는 흐름을 설명하기 위해서 역순으로 되어있습니다. 제대로된 코드를 보고싶으시면 참고하세요 )
SaveMemoActivity
이 액티비티에서는 작성한 데이터를 로컬DB에 저장하는 역할을 수행합니다.
액티비티 상단에 존재하는 디스크모양의 Save 버튼을 클릭했을 때 make_title( ) 이라는 함수가 호출되고, 작성된 본문 내용의 제목을 작성할 수 있게 dialog 창을 띄우고 그 안에 editText를 이용해서 제목을 작성하게 합니다.
그리고 setPositiveButton을 "저장" 이라고 만들고
클릭 했을 때 String s 에 작성된 제목을 가져오기 위해 editText.getText().toString() 을 사용하여 불러왔고
User 객체의 생성자를 이용해 (제목 (s), 내용(description.getText().toString()) 으로 불러와서 저장해 줍니다.
저장된 내용은
싱글톤으로 만든 데이터 베이스의 UserDao 인터페이스의 insert 함수를 통해 저장되고, 저장된 후 토스트 메세지를 띄우면서 저장을 완료합니다.
여기까지가 로컬DB에 저장된 내용을 리사이클러뷰에 표시하는 작업입니다.
실행화면
SaveMemoActivity에서 본문을 작성하고 오른쪽 상단에 save 버튼을 클릭하면 제목을 입력하라는 dialog 창이 나타나게 됩니다. 그 후 저장 버튼을 클릭하면
위와 같은 화면이 뜨는데
1번 부터 2번은 제목을 리사이클러뷰에 바인딩을 하지 않고 실행했을 때고,
3번 부터 5번까지는 제목까지 바인딩하고 실행했을 때의 모습입니다.
수정
저장하고 불러오는거 까지는 가능했는데, 저장하자마 바로 업데이트가 됬으면 좋겠지만, 앱을 껐다 켜야지 업데이트가 되는 문제가 있습니다. 이걸 해결하기 위해 찾아봤는데 전버 LiveData와 MVVM 그리고 Ovserber패턴을 이용해서 실시간을 바뀌는걸 보고있다가 자동으로 변경을 해주는게 대부분입니다.
시작했을때 아직 그 정도 수준이 아니라 자바로 천천히 짜고 있기 때문에 문제를 해결하면 다음 포스팅을 진행하겠습니다. !!!
코드는 아래 주소를 참고하세요
<로컬DB에 저장된 데이터 리사이클러뷰에 뿌려주기>
https://github.com/leewoongi/MemoPad/commit/3d5b2cabff6b853ce73a09c10336382ce09e492f
<Dialog 창 이용해서 제목 입력하고, 리사이클러뷰에 묶어주기>
https://github.com/leewoongi/MemoPad/commit/65b389dd3e2dd6149fff819b58f13a186a5ec175
'안드로이드' 카테고리의 다른 글
#6. 나만의 메모장 만들기 메모 클릭 시 작성된 메모 보기 / 메모 수정 / 메모 ROOM UPDATE / JAVA로 구현 (0) | 2020.04.07 |
---|---|
#5. 나만의 메모장 만들기 / Database에 저장된 내용 리사이클러뷰에 바로 update 하기 / 리사이클러뷰 아이템 삭제 및 ROOM, 로컬DB에서 삭제하기 / JAVA (0) | 2020.03.30 |
#3. 나만의 메모장 만들기 / ROOM error: AppDatabase() has private access in AppDatabase 문제 해결 / 싱글톤 (0) | 2020.03.07 |
#2. 나만의 메모장 만들기 UI (0) | 2020.02.28 |
#1 안드로이드 , 나만의 메모장 만들기 (0) | 2020.02.27 |