AdapterView: 어댑터를 직접 만들기
1. 리스트 화면용 레이아웃 list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:layout_margin="25dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20sp"
android:orientation="vertical"
android:layout_weight="0.6">
<TextView
android:id="@+id/txtTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
<TextView
android:id="@+id/txtContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#0000FF"
android:layout_margin="10dp"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall"/>
</LinearLayout>
<ImageView
android:id="@+id/imgIcon"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_weight="0.4"
android:src="@drawable/ic_launcher"/>
</LinearLayout>
2. 레이아웃 전체 구성 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.progdv.app03_customadapter.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/ListView02"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
</RelativeLayout>
3. 커스텀 레이아웃(상세화면용) activity_custom.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20sp"
android:orientation="vertical"
android:layout_weight="0.6">
<TextView
android:id="@+id/txtTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#000"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
<TextView
android:id="@+id/txtContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#0000FF"
android:layout_margin="10dp"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall"/>
<ImageView
android:id="@+id/img"
android:layout_width="250dp"
android:layout_height="200dp"
android:src="@drawable/ic_launcher"/>
<Button
android:id="@+id/close"
android:layout_margin="25dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="닫기"/>
</LinearLayout>
</RelativeLayout>
4. 자바빈 만들기
Generator(alt+insert)를 누른 뒤 Getter & Setter나 toString를 선택해줄 수 있다.
package com.progdv.app03_customadapter;
public class CustomDTO {
String title; // AdapterView에서 사용될 데이터
String content;
int imgIcon; // R.java에서 사용될 ID 상수
public CustomDTO(String title, String content, int imgIcon) {
this.title = title;
this.content = content;
this.imgIcon = imgIcon;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getImgIcon() {
return imgIcon;
}
public void setImgIcon(int imgIcon) {
this.imgIcon = imgIcon;
}
@Override
public String toString() {
return "제목 : "+title+"내용 : "+content;
}
}
5. 어댑터 클래스
어댑터 기능을 가지고 있는 클래스 BaseAdapter를 상속받아 정의하면 된다.
package com.progdv.app03_customadapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
public class CustomAdapter extends BaseAdapter {
Context ctxt;
int layout;
ArrayList<CustomDTO> list;
LayoutInflater inf; // xml 레이아웃 문서의 자원(위젯)을 받아 객체 생성
public CustomAdapter(Context ctxt, int layout, ArrayList<CustomDTO> list) {
this.ctxt = ctxt;
this.layout = layout;
this.list = list;
inf = (LayoutInflater)ctxt.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
// ListView에서 보여줘야 할 데이터 개수 지정 (ArrayList 크기로 지정)
@Override
public int getCount() {
return list.size();
}
// ListView에서 보여줄 객체 지정
@Override
public Object getItem(int position) {
return list.get(position);
}
// getItem() 메서드가 리턴한 객체의 고유 식별자
@Override
public long getItemId(int position) {
return position;
}
// ListView에 실제로 행을 보여줄 때 호출되는 메서드
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = inf.inflate(layout, null);
} // Layout.xml 자원을 대상으로 View 객체 생성
// LayoutInflater 객체를 이용하여 Layout.xml 파일에서 id값을 가져오기
TextView txtTitle = (TextView)convertView.findViewById(R.id.txtTitle);
TextView txtContent = (TextView)convertView.findViewById(R.id.txtContent);
ImageView imgView = (ImageView)convertView.findViewById(R.id.imgIcon);
// 리스트에서 저장된 데이터를 순서대로 가져와서 DTO 클래스 타입 변수에 저장
CustomDTO dto = list.get(position); // position에 해당하는 레코드 가져오기
txtTitle.setText(dto.getTitle());
txtContent.setText(dto.getContent());
imgView.setImageResource(dto.getImgIcon());
return convertView;
}
}
6. 어댑터를 실행하는 메인 클래스
package com.progdv.app03_customadapter;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
ListView listView;
public static ArrayList<CustomDTO> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = new ArrayList<CustomDTO>();
list.add(new CustomDTO("어촌1", "바다가 굿!", R.drawable.ph1_s));
list.add(new CustomDTO("어촌2", "해변가 굿!", R.drawable.ph2_s));
list.add(new CustomDTO("산촌1", "산 고갯길 굿!", R.drawable.ph3_s));
list.add(new CustomDTO("산촌2", "산 마루길 굿!", R.drawable.ph4_s));
list.add(new CustomDTO("농촌1", "강변 굿!", R.drawable.ph5_s));
list.add(new CustomDTO("농촌2", "한옥 굿!", R.drawable.ph6_s));
listView = (ListView)findViewById(R.id.ListView02);
// list 원소를 list_item 형식에 적용하여 어뎁터 뷰 생성
CustomAdapter adapter =
new CustomAdapter(getApplicationContext(), R.layout.list_item, list);
listView.setAdapter(adapter);// 리스트 뷰에 적용
// 이벤트 처리
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
/*Toast.makeText(getApplicationContext(),
parent.getItemAtPosition(position).toString(),
Toast.LENGTH_LONG).show();*/
Intent intent =
new Intent(MainActivity.this, CustomActivity.class);
intent.putExtra("POSITION", position);
startActivity(intent);
}
});
}
}
7. 선택시 상세화면 작동을 위한 클래스
안드로이드에서 화면 이동은 intent로 처리하고 원래 화면으로는 finish 메서드 이용한다.
package com.progdv.app03_customadapter;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
/**
* Created by Administrator on 2016-04-25.
*/
public class CustomActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom);
ImageView img = (ImageView)findViewById(R.id.img);
TextView title = (TextView)findViewById(R.id.txtTitle);
TextView content = (TextView)findViewById(R.id.txtContent);
Button btn = (Button)findViewById(R.id.close);
Intent intent = getIntent();
int id = intent.getExtras().getInt("POSITION");
CustomDTO dto = MainActivity.list.get(id);
img.setImageResource(dto.getImgIcon());
title.setText(dto.getTitle());
content.setText(dto.getContent());
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
finish();
}
});
}
}
8. 위의 자바 클래스를 실행시킬 수 있도록 설정파일에 추가
manifests 이하 AndroidManifest.xml에서 다음과 같이 <activity android:name=".CustomActivity" />를 추가해준다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.progdv.app03_customadapter">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".CustomActivity" />
</application>
</manifest>
이제 리스트에서 선택하면 상세화면으로 넘어간다.
'안드로이드' 카테고리의 다른 글
그리드 뷰 (GridView) (0) | 2016.04.26 |
---|---|
AdapterView: Spinner (0) | 2016.04.26 |
AdapterView: ListView (0) | 2016.04.25 |
ScrollView (0) | 2016.04.25 |
레이아웃: TableLayout, TableRow (0) | 2016.04.22 |