이번 글에서는 Android에서 많이 쓰이는 View 중에 하나인 ListView와 사용법에 대해서
알아보겠습니다.
앞서서 ListView를 사용하면 좋은 점이 무엇이 있을까 생각해 봅시다.
우리가 어떤 목록을 보여주고 싶은 경우라고 생각해 봅시다.
목록에는 여러 가지 아이템들이 있을 수 있죠.
예를 들면, 휴대폰의 '설정'의 각 행이라던가, 카카오톡의 친구 목록 같은것이 있겠죠?
자세히 보면 담고 있는 내용(글자)는 다르지만 형태(layout)은 같다는 걸 알 수 있습니다.
그렇다면, 어떻게 하면 이 목록을 가장 효과적으로 만들 수 있을까요?
목록의 아이템 마다 layout을 따로 만들어서 보여주는게 좋을까요?
아무래도 그 방법은 비효율적일 것 같습니다. 목록이 얼마나 있을지도 모르고요.
더 좋은 방법을 생각해 보면, 모두 예상하시듯 각 행에 들어갈 아이템의 형태를 지정해 두고,
찍어내는 식으로 아이템을 추가해 주면 좋을 것 같습니다.
마치, 클래스라는 틀을 만들고 객체라는 아이템을 찍어내는 것과 같네요.
사설이 길었는데, 그 이유는 왜 ListView라는 것이 필요하고 생겼을까 하는 고민을
한번쯤 해보셨으면 해서 그랬습니다. ㅎㅎ
그럼 본격적으로 ListView의 사용법과 필요한 것들에 대해서 알아보겠습니다.
ListView의 대략적인 흐름은 다음과 같습니다.
위 그림에서 Adapter는 ListView의 Logical한 부분들을 구현하는 것이라 생각하시면 됩니다.
ListView는 결국 View이기 때문에 설계적으로나 재사용성 문제나 가독성 면에서나 ListView에
기능을 다 구현하면 문제가 있을 수 있습니다. 그래서 가시적으로 보이는 부분은 ListView가 담당하고,
기능적인 부분을 Adapter에서 담당하는 식으로 구성이 됩니다. ArrayList는 ListView에 보여줄 아이템에
필요한 정보를 담은 객체를 담습니다.
그럼 직접 만들어 볼까요?
우선 빈 액티비티를 만들겠습니다.
다음으로 activity_main에 ListView를 넣고 ListView의 아이템 Layout을 만들어 줍시다!
(id를 정해주고 넘어갑시다.)
그 다음으로, 각 행에담을 데이터를 저장할 ListItem 클래스를 만들어 줍니다.
이제 ListItem들을 담은 ArrayList를 ListView에 연결시켜줄 ListAdapter를 만들어 줍시다.
처음 adapter라는 것을 접하신다면, 이해하기 어려운 점들이 많을 것으로 생각되므로
최대한 자세하게 적어보겠습니다.
우리가 만들 adapter는 custom adapter입니다. custom으로 adapter를 한번 만들어 보신다면
나중에 활용하기 더 좋겠죠?
우선 ListAdapter는 BaseAdapter라는 기본 adapter를 상속받습니다. 그렇게 되면
기본적으로 Override 해야하는 함수들을 볼 수 있습니다.
- getCount() : return 값은 우리가 사용할 ArrayList의 size로 정해줍니다.
- getItem(int position) : return 값으로 ArrayList의 position 번째에 있는 아이템을 반환하도록 설정해 줍시다.
- getItemId : getItem(position) 으로 가져오는 아이템의 id를 세팅해 주는 역할을 한다고 하는데
잘 사용하지 않는 것 같습니다.
[ LayoutInflater ]
Adapter에서 ListView에 아이템을 View로 넣어주는 작업을 inflate라고 하는데, 그 때에 필요한 것이 바로
LayoutInflater입니다.
[ ViewHolder ]
ViewHolder 없이 ListView를 만들 수 있지만, ViewHolder를 사용함으로서 얻는 이점이 있습니다.
ListView는 inflate를 최소화 하기 위해서 View를 재활용 하는데, 이 때 각 View의 내용을 업데이트 하기 위해서
매번 xml에서 View를 찾는 과정을 거쳐야합니다.(findViewById를 매번 호출). 이로 인한 성능저하가 일어나므로,
Item의 Layout의 각 요소를(여기서는 TextView와 CheckBox) 바로 액세스 할 수 있도록 저장해두고 사용하기
위한 객체입니다.
여기까지 만들었다면, Project는 이런 상태겠죠?
이제 마지막으로 Main을 작성해 줍시다!
Main에서 해줄 작업은
- ListView, ArrayList, ListAdapter 객체를 선언 초기화
- ListView에 ListAdapter 연결
- item 추가
- 필요시 각 item 클릭 리스너 설정
요 정도가 되겠습니다~
여기서 중요한 것은 ArrayList에 데이터를 넣어준 뒤에 Adapter에 notifyDataSetChanged()
함수를 호출해야 한다는 것입니다.
맨 아래 있는 함수는 현재 날짜를 구하기 위해 사용한 함수입니다.
에뮬레이터로 실행시켜보면 다음과 같이 나오네요.
여기서 각 아이템을 터치했을때의 이벤트를 이용해서 무언가를 해보고 싶으면, 클릭 리스너를 달아주면 됩니다.
여기서 onItemClick 안에 맨 첫번째 줄은 클릭한 아이템을 가져오는 작업입니다.
두번째 줄에 Toast란 안드로이드 OS에서 제공하는 기능인데요. 아이템을 눌렀을 시에
클릭한 아이템의 Title이 뜨도록 설정해 두었습니다.
그 아래에는 클릭을 했을 때, 아이템의 CheckBox의 값인 true 와 false를 바뀌게 해두었고,
notifyDataChanged를 호출해서 바로 적용시켜 줍니다.
위의 실행 화면에서 가운데 ListView2를 클릭하면 다음과 같이 실행됩니다.
아마 위에 코드를 적용했을 시에 바로 아이템 클릭 이벤트가 발생하지 않을 텐데요. 그 이유는
아이템에 버튼View가 포함되어 있기 때문입니다. 그래서 ListAdapter로 가서 작업을 1가지 해주어야 합니다.
빨간 밑줄 친 1줄을 ListAdapter에 추가시켜 준다면, 이제 잘 작동하는 것을 볼 수 있습니다.
여기서 만약 아이템을 눌러서 체크 박스의 상태를 바꿔주고 싶다면, 아이템 클릭시에 클릭된 아이템의 isChecked를
true 또는 false로 바꿔주고 adapter에서 notifyDataChanged를 해주면 되겠습니다~
이번 글에서는, ListView에 대해서 자세히 알아봤습니다. 다음에는 Android에서의 Thread로 돌아오겠습니다~
다음 글 : [Android 기초 : Thread]
https://codeforeveryone.tistory.com/entry/Android-%EA%B8%B0%EC%B4%88-Thread
'Develop > Android' 카테고리의 다른 글
[Android 기초 : Handler] (0) | 2019.11.06 |
---|---|
[Android 기초 : Thread] (4) | 2019.10.30 |
[Android 기초 : 시작 그리고 Manifest] (2) | 2019.10.27 |
[Android 기초 : activity_main.xml 그리고 Layout ] (0) | 2019.10.21 |