[안드로이드 Composite] ListView와 Adapter 예제
[안드로이드 Composite] ListView와 Adapter 예제 |
■ composite 객체 중에서 리스트 뷰에 대해서 포스팅을 해볼까 합니다. 이것은 Composite(합성) 이라는 단어의 뜻에서도 짐작 할 수 있듯이 다른 객체와 합성하여 화면을 구성하는 방식인데요. 리스트 뷰와 같이 '목록'을 표현하는 객체는 어탭터(Adapter)라는 개념으로 행 레이아웃과 합성해서 사용하게 됩니다.
■ 예제를 하나 만들어가면서 이해해 보도록 하겠습니다. 위의 맴핑 구조를 살펴보면서 각 객체에 해당하는 파일들을 만들고 합성하고 출력해보도록 하겠습니다.
■ 먼저 Data Set(①arrays.xml)과 AdapterView(②list.xml)를 만들어서 새로운 클래스(③listAdapter.java)를 만들어서 매핑을 하구요. ④activity_main.xml에서 리스트뷰를 배치하고, ⑤MainActivity.java 클래스에서 최종 매핑하여 출력하도록 하겠습니다. 이 예제를 진행 하려면 5개의 파일이 필요하겠네요.
1. "res/values폴더"에 Data set에 해당하는 arrys.xml 파일을 만들겠습니다. 그림과 같이 "country"라는 이름의 문자열 배열 객체를 만들었습니다.
2. 다음으로 list.xml파일을 "res/layout"폴더에 작성하도록 하겠습니다.
행 레이아웃 안에 있는 객체가 세로 방향 가운데로 배치 되도록 gravity를 "center_vertical"로 설정을 하고 문자열을 출력할 텍스트뷰를 하나 배치했습니다. 이 텍스트 뷰의 아이디를 나중에 액티비티 파일에서 불러와서 사용할것입니다.
■ 이제 두개의 파일을 매핑해줄 Activity파일을 BaseAdapter를 상속받아서 만들도록 하겠습니다.
⊙ 변수 선언과 메서드들인데요. 먼저 선언한 변수들을 살펴보면...행 레이아웃을 ListView 객체에 합성할 때 사용하는 LayoutInflater , 목록에 출력할 데이터를 받아올 배열 String[] , 이 어탭터 파일을 호출하는 Context를 받을 임시 객체(mContext), 행 레이아웃 번호를 받아올 (int) mListLayout, 로그를 출력할때 사용하기 위한 String 문자열, 목록에 출력할 데이터 수를 정의하기 위한 int(listCounet) 를 선언하고 있습니다.
⊙ 메서드는...
이 클래스의 생성자를 정의하고, 목록에서 출력하는 행의 수를 구할 때 사용하는 getCount , 지정한 행 아아템을 호출할 때 사용하는 getItem , 아이템의 아이디를 호출하기 위한 getItem, 행 레이아웃에 데이터를 맵핑하는 getView, 마지막으로 행을 선택했을때 상세 정보를 Dialog로 출력하기 위한 dateilInfo 메서드 들입니다.
■ 이 메서드들을 하나씩 작성해 하겠습니다.생성자를 다음과 같이 정의합니다.
전달받은 Context객체와 행 레이아웃의 번호를 받아 이 클래스 전역 변수에 대입하고 전달받은 데이터 셋을 받아오고, Context에서 LayoutInflater서비스를 호출하고 전달받은 데이터가 있을때만 배열의 개수를 계산해서 listCount에 대입합니다.
■ 다음으로 목록 수와 행 아이템을 호출하는 메서드입니다.
생성자에서 정의한 listCount를 목록 수로 리턴하고, getItem은 사용하지 않기 때문에 지정한 행 번호를 리턴 하고, 지정한 행 번호를 해당 아이템의 아이디로 리턴하도록 정의하고 있습니다.
■ 이제 행 레이아웃에 데이터를 매핑하는 getView()메서드를 작성합니다.
행 레이아웃을 LayoutInflater로 부모 객체인 ListView에 합성합니다. if문으로 이 객체가 없을때를 정의했는데요. 이것은 목록에 행들을 출력할 때 모든 객체의 행이 생성되는 것이 아니고 화면에 보이는 행들만 생성이 되고, 스클롤을 하게 되면 이 행들의 객체를 다시 사용하기 때문에 조건문을 작성 한것입니다.
현재 매핑중인 행 번호를 final로 선언하고, 클릭이벤트를 정의하면서 이 행 번호를 사용하고 있습니다. 이렇게 만들어진 행 객체인 convertView를 리턴해주면 ListView 객체 안에 행 객체가 매핑되어 화면에 출력이 됩니다.
■ 다음은 Dialog를 이용해서 상세정보를 표현하는 과정을 작성해 보겠습니다.
AlertDialog객체를 사용하기 위해서 Builder객체를 생성하고, 출력할 안내문을 작성하고, 닫기 버튼을 클릭하기 전까지 사라지지 않게 하기 위해서 setCancelable(false)로 설정해주고 확인버튼과 이 버튼에 대한 이벤트를 정의하고 있습니다. "확인" 버튼을 누르면 Toast창으로 "확인을 클릭했습니다"라는 안내문이 출력되게 하고 있습니다.
닫기 버튼을 클릭하면 Dialog가 사라지게 하고 있으며 위에서 정의한 AlertDialog.builder객체를 기반으로 AlertDialog객체를 생성하고 제목과, 아이콘을 정의하고 화면에 출력되도록 하고 있습니다.
■ 이렇게 해서 세가지 파일이 완성이 됐습니다. 이제 activity_main.xml파일에 ListView를 배치 합니다.
■ 다음으로 MainActivity에서 화면에 출력하는 구문을 작성하겠습니다.
arrays.xml에서 정의하고 있는 "country" 배열을 불러와서 출력할 배열 데이터로 정의를 하고, ListView에 적용할 목록 어댑터 객체를 호출하고 있습니다. 어댑터를 생성할 때 list.xml파일을 행 레이아웃으로 사용하고 있으며 매핑할 데이터는 배열 데이터를 사용하고 있습니다.
■ 실행을 해보면 다음과 같이 목록이 나타나고 스크롤을 해보면 아래쪽 목록들도 확인을 할 수 있습니다. 목록에서 아이템을 선택하면 상세정보 Dialog가 나타나고 "닫기" 버튼을 누르면 사라지고, "확인" 버튼을 클릭하면 'Toast' 창이 나타나면서 "확인을 클릭했습니다"라는 안내문이 나타났다가 사라지게 됩니다.