이것은리스트뷰의 setadapter 메소드에잘표현되어있습니다. setadapter 는리스트뷰에사용할데이터객체를넘겨주는메소드입니다. 일반적으로생각한다면 ArrayAdapter 객체를생성하여사용할데이터를저장할것이고데이터가저장된 ArrayAdapter 객체를 setadapt

Similar documents
안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

어댑터뷰

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

PowerPoint Presentation

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

. 스레드 (Thread) 란? 스레드를설명하기전에이글에서언급되는용어들에대하여알아보도록하겠습니다. - 응용프로그램 ( Application ) 사용자에게특정서비스를제공할목적으로구현된응용프로그램을말합니다. - 컴포넌트 ( component ) 어플리케이션을구성하는기능별요

( )부록

학습목표 선언하여디자인을하는방법을이해하고, 실행할수있다. 시작화면을만드는방법과대체리소스를사용하는방법을이해하고실행할수있다. About 과같은상자를구현하고, 테마를적용하는법을이해하고실행할수있다.

리니어레이아웃 - 2 -

TipssoftAppActivity.java // 기본소스파일 main.xml // 배치와구성에관련된리소스파일 string.xml // 프로그램에서사용할문자열에관련된리소스파일 컴파일을하고나면 r.java 라는소스파일이하나추가되는데이파일은리소스파일을소스파일에서이용할수있도

2 Application Name: Day10_yhg <LinearLayout android:layout_weight="3" > /> an

13ÀåÃß°¡ºÐ

슬라이드 1

슬라이드 1

PowerPoint Presentation

JAVA PROGRAMMING 실습 08.다형성

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

<4D F736F F F696E74202D205BC3D6C1BE5D3133C1D6C2F720B8AEBDBAC6AEBAE420B0ADC0C7C0DAB7E12D >

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

헬로, 안드로이드 13 주차 SQL 활용하기 (2) 강대기동서대학교컴퓨터정보공학부

PowerPoint Presentation

03장

PowerPoint Presentation

PowerPoint 프레젠테이션

제8장 자바 GUI 프로그래밍 II

Microsoft PowerPoint - 2강

안드로이드2_14

제11장 프로세스와 쓰레드

Microsoft PowerPoint - 06-Chapter09-Event.ppt

// 화면을터치하였을때해야할작업구현 case MotionEvent.ACTION_MOVE: // 화면을드래그하였때 // 화면을드래그하였을때해야할작업구현 case MotionEvent.ACTION_UP: // 화면에서터치가사라질때 // 화면에서터치가사라질때해야할자업구현 c

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

오버라이딩 (Overriding)

PowerPoint Presentation

PowerPoint Template

Design Issues

gnu-lee-oop-kor-lec06-3-chap7

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Spring Data JPA Many To Many 양방향 관계 예제

gnu-lee-oop-kor-lec10-1-chap10

JAVA PROGRAMMING 실습 09. 예외처리

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Daum 카페

50_1953.pdf

PowerPoint Presentation

PowerPoint 프레젠테이션

설계란 무엇인가?

01장

2_안드로이드UI

JVM 메모리구조

JAVA PROGRAMMING 실습 05. 객체의 활용

No Slide Title

PowerPoint 프레젠테이션

PowerPoint Presentation

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 02. 표준 입출력

안드로이드애플리케이션과통합하는데는자바가편하므로대표적인두가지라이브러리를비교해보자. 자바 ID3 태그라이브러리 jaudiotagger ID3v1, ID3v1.1, Lyrics3v1, Mp3, Mp4 (Mp4 오디오, M4a 지원범위 Lyrics3v2, ID3v2.2, ID

Microsoft PowerPoint - CSharp-10-예외처리

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

쉽게 풀어쓴 C 프로그래밊

학습목표 메뉴를추가하는방법을이해하고실습할수있다. 프로그램의기본설정 (settings) 을정의하는방법을알고실습할수있다. 대화상자를여는방법을알고실습할수있다. 로그메시지로디버깅하는방법을이해한다. 디버거로디버깅하는방법을이해한다.

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

<4D F736F F F696E74202D20C1A C0E520B5B5C5A5B8D5C6AE20C6C4C0CF20C0D4C3E2B7C220B9D720B4D9BEE7C7D120BAE420C5ACB7A1BDBA2E BC8A3C8AF20B8F0B5E55D>

C++ Programming

슬라이드 1

슬라이드 1

Microsoft PowerPoint - C++ 5 .pptx

슬라이드 1

뷰그룹 ( 레이아웃 ) 레이아웃이름 ( 클래스이름 ) FrameLayout LinearLayout 설명단일객체를표현하기위한프레임. 왼쪽상단에하나의뷰를배치하기때문에나중 에그린객체만보여준다. 수평또는수직으로자손의뷰를배치. 뷰가들어갈만한공간이없을때는자동으로 스크롤바가나타난다

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

슬라이드 1

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 07. 상속

Visual Basic 반복문

Slide 1

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

Network Programming

<BFF8B5E5B7CEC0CCB5E5322E687770>

5장. JSP와 Servlet 프로그래밍을 위한 기본 문법(완성-0421).hwp

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

Microsoft PowerPoint - 14주차 강의자료

PowerPoint Presentation

PowerPoint Template

PowerPoint Presentation

¾Èµå·ÎÀÌµå ³¹Àå-Åë.PDF

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

PowerPoint Presentation

슬라이드 1

위젯과레이아웃위젯은 View 클래스를상속해화면디스플레이와이벤트처리를할수있도록구현된스크린구성의최소단위를말한다. android.widget 패키지에는여러유형의위젯들이포함되어있다. TextView, ImageView, Button, ImageButton 등은가장간단한위젯들이

Slide 1

PowerPoint Presentation

Spring Boot

Microsoft PowerPoint 장강의노트.ppt

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

PowerPoint Presentation

2 단계 : 추상화 class 오리 { class 청둥오리 extends 오리 { class 물오리 extends 오리 { 청둥오리 mallardduck = new 청둥오리 (); 물오리 redheadduck = new 물오리 (); mallardduck.swim();

Transcription:

1. 리스트뷰의구조 리스트뷰는어떤데이터그룹에대한각각의정보들을항목별로출력시키고사용자에게원하는항목을검색하거나선택할수있도록해주는컨트롤객체입니다. 그래서다른컨트롤처럼정해진형태의정보를저장하는것이아니기때문에리스트뷰가데이터를직접관리하기는힘들었을것입니다. 그래서효과적인데이터관리를위해 "ArrayAdapter" 라는클래스가추가되었고리스트뷰는이클래스를이용해서사용자가지정한데이터에접근하도록구현되어있습니다. 간단한데이터를다룰때는 ArrayAdapter 클래스를그대로사용할수도있지만, 사용자가원하는다양한형태를효과적으로표현하기위해서는 ArrayAdapter 클래스를그대로사용하지않고 ArrayAdapter 클래스에서상속받아새로운클래스를만드는경우도많을것입니다. 이렇게다양한형태로 ArrayAdapter 클래스가변한다면리스트뷰가데이터관리객체에접근하기가힘들어질것입니다. 그래서데이터접근을표준화할수있도록 "Adapter" 라는인터페이스가추가적으로제공됩니다. ArrayAdapter 클래스는 Adapter 라는인터페이스를기준으로구현되고리스트뷰는데이터접근시에실제클래스와는상관없이 Adapter 라는인터페이스를통해서만접근함으로써두객체가독립성을유지할수있는형태로설계되어있습니다. 이구성을그림으로표현하면아래와같습니다. 결국, 클래스상속을사용해서 ArrayAdapter 클래스를다양화시키더라도리스트뷰객체는 Adapter 인터페이스를통해서만접근하기때문에데이터접근에문제가생기지않습니다. 위그림을좀더구체적으로살펴보면실질적으로데이터를관리하는최상위클래스는 BaseAdapter 이며그자식클래스로서데이터타입을직접정하여관리할수있는 ArrayAdapter 가있습니다. ( CursorAdapter, SimpleAdapter,... 등다른클래스도있지만리스트뷰와직접적인연관성이없어서다른클래스들은생략했습니다. ) BaseAdapter 클래스가구현시에 ListAdapter 와 SpinnerAdapter 인터페이스를기준으로만들어졌기때문에 ListAdapter 인터페이스를사용해서도얼마든지 BaseAdapter 클래스로만들어진객체에접근이가능합니다. 그리고 ArrayAdapter 클래스도 BaseAdapter 클래스에서상속받아만들어졌기때문에동일하게 ListAdapter 인터페이스를사용해서접근이가능합니다. 결과적으로 ArrayAdapter 에서상속받아만들어질모든클래스에게도동일하게적용될것입니다.

이것은리스트뷰의 setadapter 메소드에잘표현되어있습니다. setadapter 는리스트뷰에사용할데이터객체를넘겨주는메소드입니다. 일반적으로생각한다면 ArrayAdapter 객체를생성하여사용할데이터를저장할것이고데이터가저장된 ArrayAdapter 객체를 setadapter 메소드에전달할것입니다. 하지만리스트뷰클래스의 setadapter 메소드의원형은다음과같습니다. void setadapter(listadapter adapter); 내부적으로는 ArrayAdapter 객체든 ArrayAdapter 에서상속받은객체든상관없이모두사용할수있는 ListAdapter 인터페이스로받아서처리하겠다는뜻입니다. 즉, 리스트뷰내부적으로는 ListAdapter 를통해서만데이터에접근하겠다는뜻입니다. 2. 리스트뷰의작업순서 리스트뷰를사용하려면리스트뷰의각항목이어떤데이터를가질것인지결정해야합니다. 이것이결정되면이데이터를어떻게출력할것인지를정해야합니다. 그런다음데이터를관리할객체를생성하여사용할데이터와출력형식을저장하고리스트뷰에해당객체를넘겨주면됩니다. 작업하는순서를나열해보면다음과같습니다. 2.1 각항목에출력할데이터형식을 XML 리소스에정의한다. ( 3.1 항참조 ) 2.2 ArrayAdapter 객체를생성하면서 XML 리소스정보와실제사용할데이터를전달한다. 2.3 리스트뷰객체의 setadapter 메소드에생성된 ArrayAdapter 객체를넘긴다. 이것을그림으로표현해보면아래와같습니다. 3. 단순한리스트뷰구성하기 리스트뷰는항목의출력형식을정의해놓은 XML 리소스와리스트뷰에출력할데이터객체의배열을연결해주어야사용할수있으며아래와같은순서로따라하시면됩니다.

3.1 항목의출력형식을정의한 XML 리소스파일생성 리스트뷰의각항목은기본적으로 TextView 컨트롤의레이아웃형태를가지며, XML 코드는아래의코드처럼구성할수있습니다. XML 코드는 main.xml 파일이존재하는위치에 "list.xml" 처럼별개의이름을가진파일로생성하여아래와같은내용을저장하면됩니다. <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" <!-- 항목의내부여백을준다.--> android:padding="10dp" <!-- 출력될글자의크기를설정한다.--> android:textsize="16sp" 안드로이드개발툴에서이미정의해놓은출력형식이있으므로 XML 리소스를연결할때정의된리소스값을적절하게사용하면됩니다. 3.2 리소스코드에리스트뷰의레이아웃구성 응용프로그램의레이아웃을정의하는 main.xml 리소스파일에리스트뷰의출력형태를정의하는레이아웃을구성합니다. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" > <ListView android:id="@+id/id_list" android:layout_height="wrap_content" </LinearLayout> 레이아웃에서정의된리스트뷰는 id_list 라는 ID 값을사용하며상위요소에정의된너비값을자신의너비값으로가지며, 자신이소유한데이터를포함할만큼의높이값을가집니다. 3.3 출력될데이터객체생성 리스트뷰에연결된데이터객체는여러가지형태의객체가올수있으며기본적으로 String 을기반으로하는데이터타입이어야합니다. 리스트뷰에데이터가추가되는경우에는리스트구조로데이터를관리하는 ArrayList 클래스를사용해야하지만이번강좌에서는데이터의추가 / 삭제가없는기초적인형태를설명할것이기때문에정적인형태의 String 배열을사용하여데이터객체를생성하도록하겠습니다. static final String[] m_item_string = new String[] "Tipssoft", "Tipsware", "StagePia", "StageDMX", "HandyPHP";

리스트뷰를사용하는클래스에위의코드처럼멤버변수로배열을선언합니다. 3.4 리스트뷰에항목출력형식을지정한 XML 리소스와데이터연결 리스트뷰에 ArrayAdapter 클래스의생성자를이용하여항목출력형식을지정한 XML 리소스와데이터객체를다음과같이연결시킵니다. // 항목출력형식지정한 XML 리소스와데이터를설정한 ArrayAdapter 객체를생성한다. // 사용할 ArrayAdapter 클래스의기본데이터는 String 타입으로사용한다. ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list, m_item_string); // 레이아웃리소스파일에정의된 id_list 라는 ID 의리스트뷰를얻어온다. ListView list = (ListView) findviewbyid(r.id.id_list); // 리소스값과데이터값이저장된 ArrayAdapter 객체를리소스뷰에설정하여연결한다. list.setadapter(adapter); 만약정의해놓은항목출력형식지정한 XML 리소스가없다면 R 클래스의 layout 클래스내부에미리정의되어있는아래와같은리소스들을 ArrayAdapter 객체의생성자에서사용할수있으며사용방법은아래와같습니다. - 예약된리소스값 simple_list_item_1 simple_list_item_2 simple_list_item_activated_1 simple_list_item_activated_2 simple_list_item_checked simple_list_item_multiple_choice simple_list_item_single_choice simple_selectable_list_item - 리소스사용방법 adapter = new ArrayAdapter<String>(this, R.layout.simple_list_item_1, m_item_string); 4. 리스트뷰사용하기 이제리스트뷰를이용한간단한예제를리스너의사용법별로살펴보도록하겠습니다. 이예제는정적인문자열그룹정보를가지고있는하나의리스트뷰와문자열초기값이없는텍스트뷰가있으며리스트뷰의항목을클릭하면해당항목의문자열이텍스트뷰에출력됩니다. 이때리스트뷰는사용자가리스트뷰의항목을선택하는것을알수있도록 OnItemClickListener 라는이벤트리스너를사용합니다. 모든예제는리소스코드를동일하게사용하기때문에아래의 XML 코드들로통일하도록하겠습니다. <!-- main.xml : 메인레이아웃리소스파일 --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent"

> <ListView android:id="@+id/id_list" android:layout_height="wrap_content" <TextView android:id="@+id/id_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="20dp" android:textsize="20sp" android:layout_gravity="center_horizontal" </LinearLayout> <!-- listview_item.xml : 항목별출력형식을정의한리소스파일 --> <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:padding="10dp" android:textsize="16sp" 4.1 리스너변수를멤버변수로연결하여사용하기 소스코드의메인클래스에리스너인터페이스를멤버변수로선언및할당하고, 인터페이스의메소드를정의한후컨트롤에는해당인터페이스의멤버변수를연결합니다. 정의된인터페이스가멤버변수의형태로존재하기때문에여러컨트롤에동일한이벤트처리를해야하는경우효과적인방법입니다. package com.example.examlistview; import android.app.activity; import android.os.bundle; import android.widget.listview; // 리스트뷰클래스를사용하기위해추가 import android.widget.adapterview.onitemclicklistener; // 리스너이벤트를사용하기위해추가 // 이벤트리스너의 onitemclick 메소드에서넘어오는 AdapterView 를사용하기위해추가 import android.widget.adapterview; import android.widget.textview; // 텍스트뷰클래스를사용하기위해추가 import android.widget.arrayadapter; // 어댑터클래스를사용하기위해추가 // 이벤트리스너의 onitemclick 메소드에서넘어오는 View 를사용하기위해추가 import android.view.view; public class ExamListViewAppActivity extends Activity // 이벤트리스너인터페이스멤버변수를선언및정의한다. private OnItemClickListener m_item_listener = new OnItemClickListener() public void onitemclick(adapterview<?> parent, View view, int position, long id) // 매개변수로넘어온선택된항목 View 를 TextView 로캐스팅한다.

; TextView select_item = (TextView)view; // 리소스파일에정의된 id_tv 라는 ID 의텍스트뷰를얻어온다. TextView tv = (TextView) findviewbyid(r.id.id_tv); // TextView 로캐스팅된선택항목의문자열을얻어서텍스트뷰에출력시킨다. tv.settext(select_item.gettext()); // 리스트뷰에서사용할문자열선언 static final String[] m_item_string = new String[] "Tipssoft", "Tipsware", "StagePia", "StageDMX", "HandyPHP"; ; @Override public void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.main); // listview_item 리소스와문자열정보를저장한 ArrayAdapter 객체를생성한다. ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listview_item, m_item_string) // 리소스파일에정의된 id_list 라는 ID 의리스트뷰를얻는다. ListView list = (ListView) findviewbyid(r.id.id_list); // 리스트뷰에 ArrayAdapter 객체를설정하여리스트뷰에데이터와출력형태를지정한다. list.setadapter(adapter); // 리스너를설정한다. list.setonitemclicklistener(m_item_listener); 4.2 리스터인터페이스를단순할당하여연결하기 리스너를연결할때사용하는 setonitemclicklistener() 메소드의매개변수에 new 예약어를이용하여인터페이스를즉시할당하고메소드정의를하여연결하는것입니다. 이방법은 1 회성으로이벤트를처리할때사용하는것이좋습니다. package com.example.examlistview; import android.app.activity; import android.os.bundle; import android.widget.listview; import android.widget.adapterview.onitemclicklistener; import android.widget.adapterview; import android.widget.textview; import android.widget.arrayadapter; import android.view.view; public class ExamListViewAppActivity extends Activity static final String[] m_item_string = new String[] "Tipssoft", "Tipsware", "StagePia", "StageDMX", "HandyPHP"; @Override

g); public void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listview_item, m_item_strin ListView list = (ListView) findviewbyid(r.id.id_list); list.setadapter(adapter); // 리스트뷰에리스너인터페이스를할당및정의하여설정한다. list.setonitemclicklistener(new OnItemClickListener() public void onitemclick(adapterview<?> parent, View view, int position, long id) TextView select_item = (TextView)view; TextView tv = (TextView) findviewbyid(r.id.id_tv); tv.settext(select_item.gettext()); ); 4.3 메인클래스에서리스너인터페이스구현 (implements) 하기 소스코드가작성된메인클래스에 implement 예약어를사용하여리스너인터페이스를구현하는방법입니다. package com.example.examlistview; import android.app.activity; import android.os.bundle; import android.widget.listview; import android.widget.adapterview.onitemclicklistener; import android.widget.adapterview; import android.widget.textview; import android.widget.arrayadapter; import android.view.view; // ExamListViewAppActivity 클래스에 OnItemClickListener 인터페이스를구현한다. public class ExamListViewAppActivity extends Activity implements OnItemClickListener static final String[] m_item_string = new String[] "Tipssoft", "Tipsware", "StagePia", "StageDMX", "HandyPHP"; @Override public void oncreate(bundle savedinstancestate) super.oncreate(savedinstancestate); setcontentview(r.layout.main); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.listview_item, m_item_string); ListView list = (ListView) findviewbyid(r.id.id_list); list.setadapter(adapter);

// 리스트뷰에리스너인터페이스를구현한이클래스를넘겨주어리스너를설정한다. list.setonitemclicklistener(this); // OnItemClickListener 인터페이스의 onitemclick 메소드를정의한다. public void onitemclick(adapterview<?> parent, View view, int position, long id) TextView select_item = (TextView)view; TextView tv = (TextView) findviewbyid(r.id.id_tv); tv.settext(select_item.gettext()); < 실행화면 : 항목을클릭했을때 >