나만의 개발노트

[안드로이드] 리스트뷰(ListView) , Adapter(어댑터) 본문

[안드로이드]/[안드로이드] 공부 기록

[안드로이드] 리스트뷰(ListView) , Adapter(어댑터)

노트포미 2023. 9. 26. 02:59

선택 위젯과 어댑터

- 여러 개의 아이템 중에서 하나를 선택하는 방식의 선택 위젯은 어댑터를 사용해야 함

- 어댑터에서 데이터를 관리하도록 해야 할 뿐만 아니라 화면에 보여지는 뷰도 어댑터의 getView()메소드에서 결정함

- 선택 위젯의 가장 큰 특징은 원본 데이터를 위젯에 직접 설정하지 않고 어댑터라는 클래스를 사용하도록 되어 있다

=> 어댑터가 데이터를 불러오고, 뷰까지 만들어 줌


[사용법]

1. 아이템을 위한 XML 레이아웃 정의하기

   - 리스트뷰에 들어갈 각 아이템의 레이아웃을 XML로 정의함

2. 아이템을 위한 뷰 정의하기

   - 리스트뷰에 들어갈 각 아이템을 하나의 뷰로 정의, 이 뷰는 여러 개의 뷰를 담고 있는 뷰그룹이어야 함

   - 이것은 부분화면과 같아서 1.에서 정의한 XML 레이아웃을 인플레이션 후 설정해야 함

3. 어댑터 정의하기

   - 데이터 관리 역할을 하는 어댑터 클래스를 만들고 그 안에 각 아이템으로 표시할 뷰를 리턴하는 getView() 메소드를 정의함

4. 리스트뷰 정의하기

   - 화면에 보여줄 리스트뷰를 만들고 그 안에 데이터가 선택되었을 때 호출될 리스너 객체를 정의함


1. 아이템을 위한 XML 레이아웃 정의하기

   - 리스트뷰에 들어갈 각 아이템의 레이아웃을 XML로 정의함

 

  1) java -> org.techtown.list -> ReviewItem.java  생성 (데이터를 담아두는 class)

#ReviewItem.java

package com.example.mylistview;

public class ReviewItem {

    String id;
    String review;

    ReviewItem(String id, String review){
    	this.id = id;
    	this.review = review;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getReview() {
        return review;
    }

    public void setReview(String review) {
        this.review = review;
    }

    @Override
    public String toString() {
        return "ReviewItem{" +
                "id='" + id + '\'' +
                ", review='" + review + '\'' +
                '}';
    }
}

*파일에서 우클릭 -> Generate -> GetterAndSetter/toString 누르면 get,set메소드 자동 생성됨

 

2) res -> layout -> review_item.xml 만들기 (Item의 레이아웃 만들기)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/textView_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="3dp"
        android:text="작성 ID"
        android:textSize="20dp"
        android:textColor="#7BB0DB"
        android:textStyle="bold"/>

    <TextView
        android:id="@+id/textView_review"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="3dp"
        android:layout_marginTop="3dp"
        android:text="리뷰내용"/>
</LinearLayout>

2. 아이템을 위한 뷰 정의하기

   - 리스트뷰에 들어갈 각 아이템을 하나의 뷰로 정의, 이 뷰는 여러 개의 뷰를 담고 있는 뷰그룹이어야 함

   - 이것은 부분화면과 같아서 1.에서 정의한 XML 레이아웃을 인플레이션 후 설정해야 함

 

  1) java -> org.techtown.list -> ReviewItemView.java 만들기 (LinearLayout을 상속)

  2) 우클릭 -> Generate -> Constructor -> 가장 위 2개의 생성자 만들기

  3) init메소드 만들기

private void init(Context context){}

  4) 위 두 생성자에 init(context); 작성

  5) init() 내부에 inflater 생성 후, item의 요소 불러오기

private void init(Context context){
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.review_item, this, true);
    
    textView_id = (TextView) findViewById(R.id.textView_id);
    textView_review = (TextView) findViewById(R.id.textView_review);
}

  6) 변수에 직접 접근하지 못하도록 set요소() 만들기

public void setId(String id)}
	textView_id.setText(id);
}

public void setReview(String review)}
	textView_review.setText(review);
}

#최종 ReviewItemView.java

package com.example.mylistview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.Nullable;

import org.w3c.dom.Text;

import java.util.zip.Inflater;

public class ReviewItemView extends LinearLayout {
    TextView textView_id;
    TextView textView_review;

    public ReviewItemView(Context context) {
        super(context);
        init(context);
    }

    public ReviewItemView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    private void init(Context context){
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.review_item, this, true);

        textView_id = (TextView) findViewById(R.id.textView_id);
        textView_review = (TextView) findViewById(R.id.textView_review);
    }

    public void setId(String id){
        textView_id.setText(id);
    }

    public void setReview(String review){
        textView_review.setText(review);
    }
}

3. 어댑터 정의하기

   - 데이터 관리 역할을 하는 어댑터 클래스를 만들고 그 안에 각 아이템으로 표시할 뷰를 리턴하는 getView() 메소드를 정의함

 

  1) MainActivity.java에 ReviewAdapter 클래스 정의 (BaseAdapter 상속)

  2)  class 내부에 우클릭 -> Generate -> implement methods -> 4개 메소드 모두 작성

class ReviewAdapter extends BaseAdapter{
        @Override
        public int getCount() {
            return 0;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            return null;
        }
    }

  3) ArrayList 정의

ArrayList<ReviewItem> items = new ArrayList<ReviewItem>();

  4) ReviewAdapter에 정의해준 메소드 코드 작성

 - getCount()

public int getCount(){
	return items.size();
}

- getItem(int position)

public Object getItem(int position){
	return item.get(position);
}

- getItemId(int position) *id지정안해서 그냥 position 리턴

public long getItemId(int position){
	return position;
}

- getView(int position, View convertView, ViewGroup parent)

public View getView(int position, View convertView, ViewGroup parent) {
    ReviewItemView view = new ReviewItemView(getApplicationContext());

    ReviewItem item = items.get(position);
    view.setId(item.getId());
    view.setReview(item.getReview());

    return view;
}

  5) 데이터를 추가할 수 있는 addItem(ReviewItem item) 생성

public void addItem(ReviewItem item){
	items.add(item);
}

  6) OnCreate()에 adapter() 생성, item추가

ReviewAdapter adapter = new ReviewAdapter();
adapter.addItem(new SingerItem("김치","찌개"));
adapter.addItem(new SingerItem("감자","탕"));

4. 리스트뷰 정의하기

   - 화면에 보여줄 리스트뷰를 만들고 그 안에 데이터가 선택되었을 때 호출될 리스너 객체를 정의함

  

1) activity_main.xml에 ListView가 들어갈 자리 지정, MainActivity.java에서 ListView 불러오기

#activity_main.xml

<ListView
    android:id="@+id/listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</ListView>

#MainActivity.java

ListView listView = (ListView) findViewById(R.id.listView);

  2) listView 어댑터 설정(?)

listView.setAdapter(adapter);

#최종 MainActivity.java

package com.example.mylistview;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;

import java.sql.Array;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView listView = (ListView) findViewById(R.id.listView);

        ReviewAdapter adapter = new ReviewAdapter();
        adapter.addItem(new ReviewItem("김치","찌개"));
        adapter.addItem(new ReviewItem("감자","탕"));
        
        listView.setAdapter(adapter);
    }

    class ReviewAdapter extends BaseAdapter{
        ArrayList<ReviewItem> items = new ArrayList<ReviewItem>();

        @Override
        public int getCount() {
            return items.size();
        }

        public void addItem(ReviewItem item){
            items.add(item);
        }

        @Override
        public Object getItem(int position) {
            return items.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ReviewItemView view = new ReviewItemView(getApplicationContext());

            ReviewItem item = items.get(position);
            view.setId(item.getId());
            view.setReview(item.getReview());

            return view;
        }
    }
}

[몰아보기]

1. xml에 listView 작성한다


2. item.java 작성한다
 - 필요한 요소들 선언 (String, int 등)
 - 생성자 생성
 - setter메소드 작성


3. my_itemView.xml 작성
  : list의 아이템이 되는 xml


4.  my_itemView.xml과 짝이 되는 MyItemView.java 작성
  - my_itemView.xml의 메인 layout인 LinearLayout 상속받기
  - 상위 두개 생성자 작성
  - private void init(Context context){...} 생성
  - init()내부에 xml과 연결하는 LayoutInflater 설정
  
5. MainActivity.java에 class ItemAdapter 작성
  - extends BaseAdapter
  - implement메소드 4개 셍성
  - getView() 내부에 MyItemView 생성
  - getView()에 items.get(position) 불러오기 
  - view의 요소들 item에서 가져오기

6. listView를 MyItemAdapter에 연결
  - listView.setAdapter(adapter);


*출처 

https://www.boostcourse.org/mo316/lecture/258989?isDesc=false 

 

안드로이드 앱 프로그래밍

부스트코스 무료 강의

www.boostcourse.org