일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파이어베이스
- 안드로이드 라이브러리
- 안드로이드컴포즈
- 젯팩컴포즈
- glide
- component
- dynamiclink
- 안드로이드광고
- 선언형UI
- android kakao map
- 다이나믹 링크
- RecyclerView
- 동적 링크
- 컴포넌트
- 애드몹배너
- 아키텍처
- thread
- Firebase
- 애드몹광고
- Android
- android 지도
- 안드로이드 카카오 지도
- 안드로이드
- HTTP
- ImageView
- Android 애드몹
- Clean Architecture
- 클린 아키텍처
- JetpackCompose
- android daum map
- Today
- Total
코딩스토리
[Android/안드로이드] RecyclerView(리사이클러뷰) 뷰 재활용하기 본문
기존의 ListView는 커스터마이징 하기에도 힘들었고, 구조적인 문제로 성능상의 문제가 있었기 때문에 보다 유연하고 성능이 향상된 RecyclerView가 생겨났습니다. RecyclerView와 ListView의 가장 큰 차이점은 리사이클러뷰는 레이아웃 매니저와 , 뷰홀더를 의무적으로 사용해야하고 , Item에 대한 뷰의 변형이나 애니메이션할 수 있는 개념이 추가되면서 리스트뷰의 성능상의 이슈도 해결해 주면서 많은 타입의 뷰들을 가독성 있게 보여줄 수 있게 되었습니다.
우선 리사이클러뷰를 사용하기 위해서는 여러 클래스가 필요합니다.
주요 클래스
- Adapter - 데이터와 아이템에 대한 뷰를 생성해주는 기능을 하고있습니다.
- ViewHolder - 재활용 뷰에 대한 모든 서브 뷰를 보유하고 있습니다.(데이터 값에 따라 변경되어 보여질 뷰라고 생각하시면 됩니다.)
- Data - 데이터의 값을 저장하는 클래스입니다.
Data
DataMovie.java
package com.example.recyclerviewtest;
public class DataMovie {
int image;
String title;
public DataMovie(int image, String title){
this.image = image;
this.title = title;
}
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
뷰에 보여주기 위해 필요한 데이터들을 하나의 클래스로 모아줍니다.
Adapter
RecyclerVierAdapter.java
package com.example.recyclerviewtest;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class RecyclerVierAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// adapter에 들어갈 list 입니다.
private ArrayList<DataMovie> listData = new ArrayList<>();
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_movie, parent, false);
return new ViewHolderMovie(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
((ViewHolderMovie)holder).onBind(listData.get(position));
}
@Override
public int getItemCount() {
return listData.size();
}
void addItem(DataMovie data) {
// 외부에서 item을 추가시킬 함수입니다.
listData.add(data);
}
}
onCreateViewHolder(@NonNull ViewGroup parent, int viewType) - 뷰 홀더를 생성하고 뷰를 붙여주는 역할을 합니다.
onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) - 재활용 되는 뷰가 호출하여 실행되는 메소드입니다. 뷰홀더에 있는 onBind함수를 통해 리스트에있는 position번째 값의 데이터를 넘겨줍니다.
getItemCount() - 데이터의 개수를 반환해줍니다.(리스트가 몇개 나와야 하는지에 대한 갯수입니다)
ViewHolder
ViewHolderMovie.java
package com.example.recyclerviewtest;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
public class ViewHolderMovie extends RecyclerView.ViewHolder {
TextView tv_movie_title;
ImageView iv_movie;
public ViewHolderMovie(@NonNull View itemView) {
super(itemView);
iv_movie = itemView.findViewById(R.id.iv_movie);
tv_movie_title = itemView.findViewById(R.id.tv_movie_title);
}
public void onBind(DataMovie data){
tv_movie_title.setText(data.getTitle());
iv_movie.setImageResource(data.getImage());
}
}
ViewHolderMovie(@NonNull View itemView) - 처음 생성될때 한번만 호출되는 부분입니다. 한번만 호출되는 부분이기에 보통 findViewById()를 통해 뷰를 연결합니다.
onBind(Data data) - onBind는 데이터를 붙이기 위해 만든 함수입니다. 데이터에 있는 값에 맞게 뷰에 데이터를 보여줍니다.
이제 adapter에 data들만 추가시켜주면 완성됩니다.
Adapter Connect
MainActivity.java
package com.example.recyclerviewtest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
RecyclerVierAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
getData();
}
private void init(){
RecyclerView recyclerView = findViewById(R.id.recyclerView);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
adapter = new RecyclerVierAdapter();
recyclerView.setAdapter(adapter);
}
private void getData(){
DataMovie data = new DataMovie(R.drawable.iron_man, "아이언맨");
adapter.addItem(data);
data = new DataMovie(R.drawable.spider_man, "스파이더맨");
adapter.addItem(data);
data = new DataMovie(R.drawable.black_panther, "블랙팬서");
adapter.addItem(data);
data = new DataMovie(R.drawable.doctor, "닥터스트레인지");
adapter.addItem(data);
data = new DataMovie(R.drawable.hulk, "헐크");
adapter.addItem(data);
data = new DataMovie(R.drawable.thor, "토르");
adapter.addItem(data);
}
}
LinearlayoutManager - 리사이클러뷰에서 가장 많이 쓰이는 레이아웃으로 수평,수직 스크롤을 제공하는 리스트를 만들 수 있습니다.
getData()함수를 통해서 아답타 안에 데이터를 넣어줌으로서 완성됩니다.
레이아웃 소스코드입니다.
activity_main.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">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
item_movie.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="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_movie"
android:scaleType="centerCrop"
android:layout_width="match_parent"
android:layout_height="250dp"/>
<TextView
android:padding="20dp"
android:gravity="center"
android:textSize="16dp"
android:id="@+id/tv_movie_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
결과화면
RecyclerView의 기본적인 사용방법에 대해 알아보았습니다. 처음에는 ListView보다 복잡하고 사용하기 어려울지 몰라도 성능이나 커스터마이징면에서는 확실히 리사이클러뷰가 뛰어납니다.
질문사항이나 제가 실수한 점이 있다면 댓글을 남겨주시면 최대한 빠르게 답변해드리겠습니다.
'Android > 유용한 기술' 카테고리의 다른 글
[Android/안드로이드] 하나의 아답타로 여러개의 RecyclerView만들기/ RecyclerView Adapter 재사용 (4) | 2019.12.22 |
---|---|
[Android/안드로이드] Expandable RecyclerView 접기/펼치기(아코디언) (20) | 2019.12.20 |
[Android/안드로이드] 페이스북로그인 버튼 커스텀/Facebook Login Button Custom (0) | 2019.12.18 |
[Android/안드로이드] 페이스북 로그인 / Facebook Login 연동 (23) | 2019.12.17 |
[Android/안드로이드] 해시키(Hash key) 가져오는 방법 (330) | 2019.12.16 |