BaseAdapter를 이용한 리스트뷰를 만들어보겠습니다.
일명 커스톰뷰(CustomView) 입니다.
우선 만들 리스트뷰의 결과물을 보겠습니다.
좌측에 이미지가 있으며, 가운데에는 이름, 전화번호, 이메일이 있으며, 우측에는 수정/삭제 버튼이 있습니다.
위와 같은 모습의 리스트뷰를 만들것입니다.
=============================================
Project Name : ListBaseAdapter
Package Name : kidsbear.listbaseadapter
android version : 2.2 (8)
java version : jdk 1.6
=============================================
1. 우선 화면에 보여줄 res > layout > main.xml 레이아웃 파일을 작성합니다.
간단하게 상단에 TextView를 생성하고, 그 이외의 부분은 ListView로 가득 채웠습니다.
실행 시 화면의 모습이며, 레이아웃의 모습은 아래와 같습니다.
2. 리스트로 보여 줄 레이아웃을 작성합니다.
res > layout 폴더에 list_layout.xml 파일을 추가하여 다음과 같이 작성하여 줍니다.
이 레이아웃 파일은 ListView를 구성하는 항목 하나를 나타내는 레이아웃입니다.
즉 결과물에서 보여지는 ListView의 모습에서 아래의 그림과 같이 한 줄의 레이아웃을 작성하는 것입니다.
3. MyData.java 라는 클래스를 새로 생성하여 다음과 같이 작성합니다.
한 줄당 포함하고있는 데이터가 여러개 이므로 이것을 데이터를 담는 Class로 작성하여 사용하도록 합니다.
필요한 데이터는 이미지, 이름, 전화번호, 이메일주소 입니다.
이를 모두 포함하고 있는 클래스를 만들도록 하겠습니다.
데이터를 담을 변수 4개를 선언하였고,
이를 세팅할 수 있는 생성자를 선언하였습니다.
그리고 이들의 getter메소드를 작성하여 외부에서 사용할 수 있도록 하였습니다.
4. 이제 메인 액티비티를 작성해보도록 하겠습니다.
OnCreate() 메소드가 시작하면 setData() 메소드를 통해 ArrayList에 화면에 보여줄 데이터를 세팅합니다.
이후 MyAdapter라는 어댑터 객체를 생성합니다.
이 때 Context(this)와 세팅한 데이터(ArrayList)를 참조변수로 보내줍니다.
아직 작성전이므로 빨간줄이 보일것입니다.
다음으로 main.xml에서 작성한 ListView를 참조하여 이를 어댑터와 연결하여 줍니다.
액티비티에서 작업할 내용은 이것이 전부입니다.
ListView는 연결된 Adapter를 참조하여 화면에 보여주는 것입니다.
그럼 MyAdapter 클래스를 작성하여 보겠습니다.
5. BaseAdapter를 상속한 MyAdapter라는 클래스를 생성하여 다음과 같이 작성합니다.
BaseAdapter는 추상클래스로써 이 클래스를 상속받으면 반드시 오버라이딩 해야 하는 메소드가 있습니다.
getCount(), getItem(), getItemId(), getView() 메소드가 그것입니다.
getCount() 메소드는 어댑터에 몇개의 데이터가 존재하는지 확인하는데 여기서는 ArrayList의 사이즈를 리턴했습니다.
getItem() 메소드는 position 위치의 항목에 대해 확인하는데 여기서는 Name항목을 리턴했습니다.
getItemId() 메소드는 위치를 확인하는데 position 그대로를 리턴했습니다.
getView() 메소드.. 이것이 가장 중요합니다.
여기에서 항목 하나를 출력하기 위한 뷰(View)를 생성하여 리턴하는 역할을 합니다.
매개변수로 받는 첫번째인 position은 항목의 순서값이며,
두번째인 convertView는 이전에 생성된 View입니다. 처음에는 생성된 View가 없기 때문에 null값입니다.
따라서 null일때, 우리가 작성한 list_layout.xml 레이아웃을 인플레이트 해서 convertView에 넣어주는 것입니다.
만약 리스트뷰를 처음 보여주는 화면에 5줄의 항목이 표시된다면 처음 5줄을 생성할 때에는 convertView가 모두 null값이며,
위와같이 레이아웃을 인플레이트해서 생성해줍니다.
이 후 ListView를 위나 아래로 스크롤 할때 사라지는 convertView는 반환되고 그것을 재사용하는 형태입니다.
세번째인 parent는 생성되는 뷰의 부모, 여기서는 어댑터와 연결된 ListView가 그것입니다.
그렇게 convertView의 객체가 생성되면 아래에서 각 뷰들의 항목을 참조하여 데이터를 세팅하며,
버튼에는 클릭 이벤트를 설정합니다.
그리고 그렇게 설정이 완료 된 convertView를 리턴하고 액티비티의 ListView는 이것을 화면에 보여주게 되는 것입니다.
위와같이 BaseAdapter를 상속한 Adapter 클래스를 사용하면,
수많은 형식은 레이아웃들을 표현할 수 있습니다.
또한 어댑터와 데이터, 레이아웃이 각 각 분리되어 있어 유연성이 굉장히 좋습니다.
'프로그래밍 정리 > 안드로이드' 카테고리의 다른 글
APPWIDGET_RESIZE (0) | 2012.06.21 |
---|---|
CustomDialog (0) | 2012.06.19 |
java에서 implements Serializable(객체 직렬화란) (0) | 2012.06.15 |
안드로이드에 탑재된 리눅스 커널 버전 확인하기 (0) | 2012.06.13 |
디바이스 모델명 (0) | 2012.06.13 |