어댑터로 레이아웃 빌드
레이아웃의 콘텐츠가 동적이거나 미리 정의되지 않은 경우, AdapterView의 서브클래스가 되는 레이아웃을 사용하여 런타임에 뷰로 레이아웃을 채울 수 있다. AdapterView 클래스의 서브클래스는 Adapter를 사용하여 자신의 레이아웃에 데이터를 바인딩한다. Adapter가 데이터 소스와 AdapterView 레이아웃 사이의 중개자 역할을 한다. Adapter가 데이터를 검색하여 (배열 또는 데이터베이스 쿼리와 같은 소스로부터) 각 항목을 뷰로 변환해서 AdapterView 레이아웃에 추가될 수 있도록 한다.
어댑터로 지원되는 일반적인 레이아웃의 몇 가지 예는 다음과 같다.
목록 보기 | 그리드 보기 |
스크롤 단일 열 목록을 표시한다. | 열과 행의 스크롤 그리드를 표시한다. |
데이터로 어댑터 뷰 채우기
ListView 또는 GridView와 같은 AdapterView를 채우려면 AdapterView 인스턴스를 Adapter에 바인딩하면 된다. 이는 외부 소스로부터 데이터를 검색하여 각 데이터 항목을 나타내는 View를 생성한다.
Android는 Adapter의 서브클래스를 여러 개 제공한다. 이는 여러 가지 종류의 데이터를 검색하고 AdapterView의 뷰를 빌드하는 데 유용하다. 가장 일반적인 ArrayAdapter, SimpleCursorAdapter 어댑터 두 가지가 있다.
ArrayAdapter
데이터 소스가 배열인 경우에 이 어댑터를 사용합니다. 기본적으로 ArrayAdapter가 각 항목에서 toString()을 호출하고 그 콘텐츠를 TextView에 배치함으로써 각 배열 항목의 뷰를 생성한다.
예를 들어, ListView로 문자열 배열을 표시하고자 하는 경우, 생성자를 사용하여 새로운 ArrayAdapter를 초기화해서 각 문자열과 문자열 배열의 레이아웃을 지정하면 된다.
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, myStringArray);
생성자 인수는 다음과 같다.
그런 다음 ListView에서 setAdapter()를 호출하기만 하면 된다.
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(adapter);
각 항목의 외관을 맞춤설정하려면 배열에서 객체의 toString() 메서드를 재정의하면 된다. 아니면, 각 항목에 TextView가 아닌 뷰를 생성하고자 하는 경우 (예를 들어, 각 배열 항목에 ImageView를 원하는 경우), ArrayAdapter 클래스를 확장하고 getView()를 재정의하여 각 항목에 원하는 뷰 유형을 반환한다.
SimpleCursorAdapter
데이터 소스가 Cursor인 경우에 이 어댑터를 사용한다. SimpleCursorAdapter를 사용하는 경우, Cursor에 있는 각 행에 사용할 레이아웃을 지정해야 한다. 또한, Cursor의 어느 열이 레이아웃의 어느 뷰에 삽입되어야 할지도 지정해야 한다. 예를 들어, 사람 이름과 전화번호로 이루어진 목록을 생성하고자 하는 경우, 각 사람에 행이 하나씩 있고 이름과 번호에 열이 들어 있는 Cursor를 반환하는 쿼리를 실행하면 된다. 그런 다음, 레이아웃에서 각 결과에 관하여 Cursor의 어느 열을 원하는지 지정하는 문자열 배열을 만들 수 있고, 각 열이 배치되어야 하는 상응하는 뷰를 지정하는 정수 배열을 만들면 된다.
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER};
int[] toViews = {R.id.display_name, R.id.phone_number};
SimpleCursorAdapter를 인스턴스화하는 경우, 각 결과에 사용할 레이아웃, 결과가 들어 있는 Cursor 및 다음 두 배열을 전달한다.
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.person_name_and_number, cursor, fromColumns, toViews, 0);
ListView listView = getListView();
listView.setAdapter(adapter);
그러면 SimpleCursorAdapter가 Cursor에 있는 각 행에 관한 뷰를 하나씩 생성한다. 이때, 상응하는 toViews 뷰 안에 각 fromColumns 항목을 삽입하여 제공된 레이아웃을 사용한다.
앱 수명이 남아 있는 동안 어댑터가 읽는 기본 데이터를 변경하는 경우, notifyDataSetChanged()를 호출해야 한다. 연결된 뷰에 데이터가 변경되었으며 새로고침 해야 함을 알린다.
클릭 이벤트 처리
AdapterView에 있는 각 항목에서의 클릭 이벤트에 응답하려면 AdapterView.OnItemClickListener 인터페이스를 구현하면 된다.
// Create a message handling object as an anonymous class.
private OnItemClickListener messageClickedHandler = new OnItemClickListener() {
public void onItemClick(AdapterView parent, View v, int position, long id) {
// Do something in response to the click
}
};
listView.setOnItemClickListener(messageClickedHandler);
https://developer.android.com/guide/topics/ui/declaring-layout?hl=ko
'App Programming > Android Studio' 카테고리의 다른 글
[Android Studio] 이미지 위에 텍스트 (Text Over Image) (0) | 2022.08.04 |
---|---|
[Android Studio] Default Activity not found (0) | 2022.08.04 |
[Android Studio] 레이아웃 (3) (0) | 2022.08.04 |
[Android Studio] 레이아웃 (2) (0) | 2022.08.04 |
[Android Studio] 레이아웃 (1) (0) | 2022.08.04 |