본문 바로가기
[ Developer ]/Android

[Android] 안드로이드 List View 리스트 뷰 출력

by 김현섭. 2016. 7. 17.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
Android List View
리스트 뷰
  • 리스트 뷰의 원리를 이해해야 코드를 이해할 수 있습니다.
  • 약 100개의 정보가 담긴 List가 있다고 가정했을 때
  • 화면에서 6개를 보여주고 스크롤을 이용해 아래로 내리면서 총 100개의 정보를 볼 수 있다고 하겠습니다.
  • 화면상에 6개만 보입니다. 나머지 94개는 아래 있다고 생각할 수 있지만 아닙니다.
  • ListView는 화면에 보여지는 필요한 아이템만 가져올 뿐 100개 전체를 불러오지 않습니다.
  • 즉, 화면에 6개의 칸이 존재하고 그 칸에 계속 바꿔낍니다.
  • 아래에서 전체의 ListView가 ViewGroup 입니다.
  • 아래 정보가 담겨있는 한칸 한칸이 Cell 입니다.

Custom List View 라는 이름으로 프로젝트를 생성합니다.
Layout은 Empty로 설정했습니다.


minSdkVersion은 16으로 설정했습니다.


@ List View 생성
사용할 ListView를 activity_main.xml에 만들었습니다.


@ Layout Resource File 생성
item_list.xml 만들겠습니다.
제목, 글쓴이, 
Gravity는 두 가지가 있습니다.
  1. Layout gravity : 하위 View(Widget) 들을 정렬한다.
  2. gravity : 내용물들을 정렬한다.


@ VO(Value Object) 생성
MainActivity가 있는 패키지 안에 ArticleVO 라는 이름의 java class를 만듭니다.
제목, 글쓴이, 조회수를 담을 클래스입니다.
변수들을 만들고 생성자와 Getter, Setter를 만듭니다.
생성자와 Getter, Setter는 Alt + Insert 단축키를 이용하여 만들 수 있습니다.

간단한 방법
간단한 방법이지만 가장 안좋은 방법이다.
매번 convertView를 만든다.
즉, 총 10만개의 데이터가 있을 때 맨 밑으로 갔다가 다시 맨위로 올라오면 총 20만개의 convertView를 만들게된다.
메모리 낭비가 심하여 갑자기 램이 죽을 수도 있다.
객체(convertView) 생성을 최소화 시켜줄 필요가 있다.


가장 효율적인 방법
홀더패턴이라 불린다.
View 한 칸에 사용되는 것들을 홀더에 넣어놓고 convertView(한 칸)에 홀더를 setTag 시킨다.
사용할 때는 매번 생성하지 않고 convertView에 태그되어있는 홀더를 꺼내서 사용한다.
이렇게 작성하면 메모리를 거의 사용하지 않는 방법이 된다.


Serializable
리스트 뷰의 여러 정보중 하나를 클릭했을 때 해당 정보에 대한 상세정보를 보여줄 디테일 화면을 만들겠습니다.
우선 알아두어야 할 것이 Serializable입니다.
참조를 시키고싶은 클래스에 implements Serializable 해주면 메모리가 동기화된다.
두 개의 서버에서 똑같은 클래스의 똑같은 주소의 참조를 시킬 때 Serializable을 사용한다.
예를 들어 두 개의 Activity가 완전히 다른 메모리를 사용하고 있을 때 Activity 내에서 일정 부분을
동기화(같은 메모리) 시키고 싶을 때도 Serializable을 사용한다.
배터리와 메모리 사용에 효율적이다.
이제 Serializable을 이용해서,
intent putSerializableExtra를 통해 ArticleVO(객체)를 담아서 다른 Activity로 보내보겠습니다.

@ 객체 intent로 보내기
상세 정보를 보여줄 DetailActivity를 만듭니다.



activity_detail.xml에서 상세 정보를 보여줄 화면(Layout)을 구성합니다.

ArticleVO에 implements Serializable 해줍니다.
동기화(메모리 공유)시켜서 해당 객체를 intent를 통해 보내서 DetailActivity에서 객체를 받아 사용할 수 있도록 준비합니다.
리스트뷰에서 한 칸을 클릭했을 때, 그 칸 안에 담긴 정보를 가지고 있는 ArticleVO 객체를 putExtra를 통해 DetailActivity로 보냅니다.

@ 객체 받기
MainActivity에서 보낸 ArticleVO 객체를 DetailActivity에서 받아보겠습니다.
Serialize(동기화)된 클래스의 객체를 받을 땐 getSerializableExtra 를 이용합니다.


@ 디테일 화면
리스트뷰에서 4번 글을 눌러보겠습니다.


DetailActivity에서 4번 글 객체를 받아 보여줍니다.