본문 바로가기
App Programming/Android Studio

[Android Studio] 레이아웃 (4)

by goatlab 2022. 8. 4.
728x90
반응형
SMALL

어댑터로 레이아웃 빌드

 

레이아웃의 콘텐츠가 동적이거나 미리 정의되지 않은 경우, 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);

 

생성자 인수는 다음과 같다.

 

  •  Context
  • 배열에 있는 각 문자열의 TextView가 들어 있는 레이아웃
  • 문자열 배열

 

그런 다음 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 

 

레이아웃  |  Android 개발자  |  Android Developers

레이아웃은 활동 또는 앱 위젯의 UI와 같은 사용자 인터페이스의 시각적 구조를 정의합니다. 두 가지 방법으로 레이아웃을 선언할 수 있습니다. Android 프레임워크를 통해 이 두 가지 메서드의 하

developer.android.com

 

728x90
반응형
LIST