Android #3 - List View

yoondengo·2021년 5월 17일
0

ANDROID

목록 보기
3/4
post-thumbnail

ListView란 무엇인가?

똑같은 틀을 가진 것들이 연속해서 나오게 하는 것을 편리하게 하기 위한 도구.

데이터와 레이아웃의 분리!

데이터 -> ADAPTER -> 레이아웃
어댑터를 따로 만들어 주어야 한다
*context란 화면 구성을 해주는 역할로써 시스템의 근본을 의미한다

리사이클러뷰와의 차이?

리사이클러뷰가 좀 더 상위의 뷰이다.(ListView는 Legacy)
리스브뷰에서 메모리 활용성을 높인 것이 리사이클러 뷰이다
재활용이란 레이아웃을 재활용하는것을 의미한다.
이 때문에 리사이클러 뷰에서는 '뷰홀더'라는 것을 필수로 만들어야 한다.

시행착오

리스트뷰에서는 길게누르기 이벤트라던지, 옆으로 밀어서 삭제버튼 나오게 하기 등등 의 기능을 쓸 수 없는 모양이다. 일주일 내내 삽질해봤는데 잘 안되었고 알고보니 리사이클러 뷰로 했으면 되었을 수 도 있었다고 함.

무엇을 만들었나?

인스타그램을 한번 따라 만들어 보았다.

(사진이 왤케 크게 나오지...)
어쨌든 보시다시피 게시물 각각이 리스트뷰로 생성을 한것이다.
여기서 살펴볼 부분이라면 일단 하트버튼이 있는데 이거는 체크박스로 구현을 한 것이다. drawable에 체크박스를 꾸며줄 xml을 작성하고 클릭됐을때, 안됐을때 를 각각 설정해준 것.

하트버튼이 눌린것은 즉 isChecked의 값이 true인것을 의미하는데 기본적으로는 리스트뷰를 내리면 이게 초기화가 되어서 화면에 나올때마다 true였으면 true인것으로 바꿔야한다.
난 여기서 postDataList(리스트뷰를 표현할 정보들을 담은 배열)에 하트의 boolean값 역시 저장해서 getView에

binding.heartButton.isChecked = postDataList[position].heart == true

를 추가해서 매번 boolean값을 적용하게끔 하였다.

댓글보기 또는 댓글 버튼을 누르면 댓글 액티비티로 넘어가야 하는데 이것에 대한 이벤트 리스너는 Adapter에서 등록해야한다. 사용자 이름값을 intent로 해서 댓글 액티비티로 넘기면 끝이다.

삭제버튼을 밀어서 생성하는걸 못 구현해서 저렇게라도 했다.
ListView의 가장 큰 특징이라고 할 수 있는 CRUD중 create와 delete를 구현했다.

여기서 주목할점은 '댓글'부분은 adapter의 영역(listview니까)이고 맨 아래 댓글 입력은 액티비티의 영역이라는 점이다.
그래서 당연히 생성은 액티비티에서 이벤트 등록을하고 삭제는 어댑터에서 이벤트 처리를 해준다.

commentDataList = tempArray
commentDataList.add(Comment(binding.createComment.text.toString(), false))
binding.commentList.adapter = CommentAdapter(this, commentDataList)

이 부분들이 생성에 해당하는데 일단 첫번째라인은 sharedpreferences를 구현해서 밖으로 나갔다 와도 이어서 댓글을 달 수 있도록 하였기 때문에 tempArray즉 기존 댓글들을 넣고 시작한다는 의미이다. 이걸 안하면 댓글을 쓰는순간 댓글이 다 사라지고 새 댓글만 남음
두번째 라인은 datalist에 넣는 그림이고, 세번째 라인은 어댑터에 저장해서 매번 생성할때마다 리스트를 그려내고 있음을 볼 수 있다.

어댑터에서의 삭제 이벤트는 다음과 같이 처리했다

commentDataList.removeAt(position)
notifyDataSetChanged()

이런게 있다고 알 정도만 되어야할 것 같다

참고로 shared preferences에서 배열을 저장하는 기능은 없다.
대신에 json데이터를 저장하는 기능은 있는데 이것을 이용해서 나름의 편법?으로 json데이터로 배열을 변환시킨뒤에 저장하고,
다시 불러올때는 json데이터를 파싱해서 사용하는게 가능하다.

profile
Software Engineer (전산쟁이)

0개의 댓글