본문 바로가기
JAVA/Android

[Android] Custom Listview 사용

by 개폰지밥 2019. 6. 2.
반응형

내가 만들고 싶은 프로젝트는 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 객체 생성 후 listviewset

 

| 작업 흐름(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.xmllistview 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
반응형

댓글