일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 데이터 타입
- 함수 인자
- 230503
- parcelable
- 프래그먼트
- querySelector
- string
- Class
- 인텐트
- fragment
- 230508
- C++
- DFS
- 부가데이터
- javascript
- classList
- serializable
- ViewPager
- intent
- null-safety
- DOMContentLoaded
- textContent
- html
- putextra
- 생명주기
- 안드로이드
- Adapter
- ActionBar
- Flutter
- 230510
- Today
- Total
나만의 개발노트
[안드로이드] 리스트뷰(ListView) , Adapter(어댑터) 본문
선택 위젯과 어댑터
- 여러 개의 아이템 중에서 하나를 선택하는 방식의 선택 위젯은 어댑터를 사용해야 함
- 어댑터에서 데이터를 관리하도록 해야 할 뿐만 아니라 화면에 보여지는 뷰도 어댑터의 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
'[안드로이드] > [안드로이드] 공부 기록' 카테고리의 다른 글
[안드로이드] 액티비티(Activity), 인텐트(Intent) - 화면전환 (1) | 2023.10.07 |
---|---|
[안드로이드] 원형이미지뷰(CircleImageView) (0) | 2023.10.07 |
[안드로이드] 인플레이션(inflation), 부분화면 (0) | 2023.09.26 |
[안드로이드] inflate, toast, snapbar, AlertDialog (0) | 2023.09.25 |
[안드로이드] 이벤트 처리_터치 이벤트, 제스처 이벤트 (0) | 2023.09.18 |