내가 만들고 싶은 프로젝트는 LH+SH 임대주택 어플을 짬뽕하는 것이여서 일반 Listview로 어렵고 CustomListview를 이용해서 어플을 만들어야 한다. 그래서 교수님의 Listview 자료를 참고해서 Custom Listview를 정리하였다.
l Custom Listview
- 하나의 이미지(ImageView)와 두 개의 문자열(TextView)로 구성
3개의 문자열로 구성된 ListView 테스트
l 프로젝트 구성
- Activity_main.xml listview 추가
- Listview item layout 추가
- Data set(pojo) 클래스 정의
- Adapter 클래스 상속 및 구현
- Adapter 객체 생성 후 listview에 set
| 작업 흐름(Workfollow)
Activity_main.xml에 listview xml 추가 -> listview item layout 구성(row.xml 추가 및 작성 ) -> data class(pojo)클래스 구현 -> adapter 클래스 상속 및 구현 -> mainactivity 에서 adapter 객체 생성 및 데이터 바인딩 -> mainactivity에서 adapter와 listview 연결
| 소스코드
Actvitiy_main.xml
Actvitiy_main.xml에 listview xml 추가
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<ListView
android:id="@+id/LH"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
row.xml
ListView Item Layout 구성 (row.xml 추가 및 작성)
- ArrayAdapter 사용 시에는 ListView Item(Cell) 생성을 하지 않았지만 Custom ListView 구현 시 ListView Item에 대한 정의 및 구현이 필요
*ArrayAdapter 사용시 “android.R.layout.simple_list_item_1”을 전담함으로써 ListView Item을 구현을 할필요가 없음
“android.R.layout.simple_list_item_1”는 안드로이드 시스템 내부에 미리 만들어진 리소스, SDK를 설치하면 자동으로 되며 어떠한 추가 작업 없이 개발자가 사용 가능
<?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">
<TextView
android:id="@+id/textView0"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_weight="4">
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="New Text"
android:textSize="24dp"
android:textColor="#000000"
android:gravity="center_vertical"
android:layout_weight="2" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16dp"
android:textColor="#666666"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
ListViewItem.java
Data Class(Pojo) 클래스 구현
- ListView 아이템을 위한 Layout Resource를 정의했다면 ListView Item에 출력될 데이터를 위한 클래스 정의
- 예제에서는 3개의 TextView를 사용
| getter setter 가져오는 법
아래와 같이 입력 한 후
public String happyStr;
public String titleStr;
public String descStr;
Code -> Generate -> Getter and Setter
package com.cookandroid.rentalproject;
public class ListViewItem {
public String happyStr;
public String titleStr;
public String descStr;
public void setHappy(String happy) {
happyStr = happy;
}
public void setTitle(String title) {
titleStr = title;
}
public void setDesc(String desc) {
descStr = desc;
}
public String getHappy() {
return this.happyStr;
}
public String getTitle() {
return this.titleStr;
}
public String getDesc() {
return this.descStr;
}
}
Adapter 클래스 상속 및 구현
package com.cookandroid.rentalproject;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class ListViewAdapter extends BaseAdapter {
//adpater에 추가된 데이터를 저장하기 위한 arraylist
public ArrayList<ListViewItem> listViewItemList = new ArrayList<ListViewItem>();
//ListViewAdapter의 생성자
public ListViewAdapter(){
}
// Adapter에 사용되는 데이터의 개수를 리턴, : 필수 구현
@Override
public int getCount() {
return listViewItemList.size();
}
// position에 위치한 데이터를 화면에 출력하는데 사용될 View를 리턴, : 필수 구현
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final int pos = position;
final Context context = parent.getContext();
//"listview_item" Layout을 infalte하여 convertView 참조 획득.
if(convertView ==null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.row, parent, false);
}
//화면에 표시될 View(Layout이 inflate된)으로부터 위젯에 대한 참조 획득
TextView happyTextView = (TextView) convertView.findViewById(R.id.textView0);
TextView titleTextView = (TextView) convertView.findViewById(R.id.textView1);
TextView descTextView = (TextView) convertView.findViewById(R.id.textView2);
//Data Seet(listViewItemList)에서 position에 위치한 데이터 참조 획득
ListViewItem listViewItem = listViewItemList.get(position);
// 아이템 내 각 위젯에 데이터 반영
happyTextView.setText(listViewItem.getHappy());
titleTextView.setText(listViewItem.getTitle());
descTextView.setText(listViewItem.getDesc());
return convertView;
}
//지정한 위치(position)에 있는 데이터와 관계된 아이템(row)의 ID를 리턴. : 필수 구현
@Override
public long getItemId(int position) {
return position;
}
// 지정한 위치(position)에 있는 데이터 리턴 : 필수 구현
@Override
public Object getItem(int position) {
return listViewItemList.get(position);
}
//아이템 데이터 추가를 위한 함수, 개발자가 원하는대로 작성 가능.
public void addItem(String happy, String title, String desc){
ListViewItem item = new ListViewItem();
item.setHappy(happy);
item.setTitle(title);
item.setDesc(desc);
listViewItemList.add(item);
}
}
package com.cookandroid.rentalproject;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*ListView list = (ListView) findViewById(R.id.LH);
ArrayAdapter adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data);
list.setAdapter(adapter);*/
ListView listview;
ListViewAdapter adapter;
//Adapter 생성
adapter = new ListViewAdapter();
//리스트뷰 참조 및 Adapter달기
listview = (ListView) findViewById(R.id.LH);
listview.setAdapter(adapter);
//첫 번째 아이템 추가.
adapter.addItem("행복주택","이천마장","2019-05-31 ~ 2019-06-17");
//두 번째 아이템 추가.
adapter.addItem("행복주택","남양주별내","2019-05-31 ~ 2019-06-17");
//세 번째 아이템 추가.
adapter.addItem("행복주택","화성발안","2019-05-28 ~ 2019-06-25");
}
}
mainactivity에서 adapter 객체 생성 및 데이터 바인딩
| 결과
[관련 게시글]
[Android] 안드로이드 스튜디오 설치 : https://seul96.tistory.com/58 [Android] 바람개비 회전 애니메이션 : https://seul96.tistory.com/62 [Android] 화면터치 시 이미지 따라오기 : https://seul96.tistory.com/310 [Android] 그림 글 배치 : https://seul96.tistory.com/63 [Android] 글의 목록 만들기 : https://seul96.tistory.com/311 [Android] manifests, java, res / 레이아웃 유형 : https://seul96.tistory.com/64 [Android] toast 배경색 변경 방법 + 색상표 : https://seul96.tistory.com/65 [Android] 계산기 구현 : https://seul96.tistory.com/66 [Android] 위치 배열 gravity linear layout relative layout 사용 : https://seul96.tistory.com/67 [Android] 액티비티 전환 intent 예시 + 4대 컴포넌트 : https://seul96.tistory.com/68 [Android] 이벤트 처리와 액티비티간 이동 : https://seul96.tistory.com/70 [Android] 리스트뷰 : https://seul96.tistory.com/79 [Android] 커스텀 리스트뷰 : https://seul96.tistory.com/80 [Android] 안드로이드 공공데이터(API) 사용하는 방법 : https://seul96.tistory.com/85 [Android] Padding/layout_margin, visibility 속성 : https://seul96.tistory.com/312 |
'JAVA > Android' 카테고리의 다른 글
[Andorid] follow me (화면 터치 시 이미지 따라옴) (0) | 2021.09.16 |
---|---|
안드로이드 개발 - 공공데이터 사용(API) (0) | 2019.06.08 |
[Android] - 리스트뷰(listview) (0) | 2019.06.02 |
[Andorid] 이벤트 처리와 액티비티간 이동 (0) | 2019.05.03 |
[Android] activity 전환, Intent 예시 + 4대 컴포넌트 (0) | 2019.04.29 |
댓글