RecyclerView
는 ListView의 개선판이다. 목록의 뷰는 ViewHolder 로 표현되며 각 ViewHolder 는 View를 사용하여 각 항목을 표시하는 역할을 한다.
ViewHolder 객체는 Adapter 에서 관리하며 Adapter 는 필요에 따라 ViewHolder 를 만들어 onBindViewHolder()를 호출함으로써 데이터에 바인딩한다.
View를 채울 때 LayoutManger 가 필요한데, LinearLayoutManager 또는 GridLayoutManager 를 쓰거나 직접 구현하여 사용하면 된다.
1. build.gradle 추가
dependencies {
implementation "androidx.recyclerview:recyclerview:1.1.0"
}
2.Main_layout에 RecyclerView 추가 .
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_obbligato_post"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbarFadeDuration="0" // 스크롤바 자동 없어짐 설정
android:scrollbarSize="5dp" // 스크롤바 사이즈
android:scrollbarThumbVertical="@android:color/darker_gray"// 스크롤바 색상설정
android:scrollbars="vertical"
/>
3.item_layout 만들기 .
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content"> /// wrap으로 설정해줘야됨
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:padding="20dp">
<ImageView
android:id="@+id/profile"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_launcher_foreground"/>
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:text="이름"
android:textSize="16sp"
android:textColor="#000"/>
<--상태 메시지-->
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="100dp"
android:text="상태메시지"
android:textSize="12sp"
android:textColor="#444"
android:maxLines="1"/>
</LinearLayout>
</LinearLayout>
4.Data 클래스 만들기
item_layout에 들어갈 데이터들을 넣어주기 위한 클래스
들어갈 데이터를 생성한다음 키보드 alt,Insert 키를 눌러서 getter ,setter , constructor 만들기
public class Data {
//item_layout에 들어갈 데이터
String name; //item에 넣어질 이름
String message; //item에 넣어질 메세지
int resourceId; //item에 넣어질 사진
///getter setter 만들기
public int getResourceId() {
return resourceId;
}
public String getMessage() {
return message;
}
public String getName() {
return name;
}
public void setMessage(String message) {
this.message = message;
}
public void setName(String name) {
this.name = name;
}
public void setResourceId(int resourceId) {
this.resourceId = resourceId;
}
//constructor 만들기
public Data(int resourceId,String name, String message ) {
this.name = name;
this.message = message;
this.resourceId = resourceId;
}
}
5.Adapter 만들기
Adapter 는 RecyclerView.Adapter를 상속받아 구현하고, ViewHolder 는 RecyclerView.ViewHolder를 상속받아 구현한다.
1. 처음
public class Adapter extends RecyclerView.Adapter<Adapter.AdapterViewholder> {
}
그러면 빨간줄이 생성이 된다. 당황하지 말고 alt , enter 를 눌러주고 create class 를 해준다 . 그러면 또 빨간줄이 생길것이다. 당황하지 말고 빨간줄을 클릭하고 alt , enter를 눌러서 계속 import를 해주자 .
2.완성
public class Adapter extends RecyclerView.Adapter<Adapter.AdapterViewholder> {
@NonNull
@Override
public AdapterViewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(@NonNull AdapterViewholder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
public class AdapterViewholder extends RecyclerView.ViewHolder {
public AdapterViewholder(@NonNull View itemView) {
super(itemView);
}
}
}
50% 왔다.
6. item_layout과 Adapter 연결
package com.example.recyclerview_posting;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
public class Adapter extends RecyclerView.Adapter<Adapter.AdapterViewholder> {
private ArrayList<Data> Data_arrayList; ///아까 만들어두었던 Data 클래스를 어레이리스트로 만든다.
public Adapter(ArrayList<Data> arrayList) { //Main_class와 연동하기 위한 adapter 파라미터
this.Data_arrayList = arrayList;
}
@NonNull
@Override ///onCreateViewHolder에서는 어떤 레이아웃과 연결해야되는지 설정하고 view를 만들어준다.
public AdapterViewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout,parent,false);
AdapterViewholder holder = new AdapterViewholder(view);
return holder;
}
@Override //받아온 데이터를 item_layout에 set해주는 곳
public void onBindViewHolder(@NonNull AdapterViewholder holder, int position) {
holder.profile.setImageResource(Data_arrayList.get(position).getResourceId());
holder.name.setText(Data_arrayList.get(position).getName());
holder.message.setText(Data_arrayList.get(position).getMessage());
}
@Override
//아이템 카운트
public int getItemCount() {
return (null != Data_arrayList ? Data_arrayList.size() :0);
}
/// item_layout의 데이터 초기화해주는 클래스
public class AdapterViewholder extends RecyclerView.ViewHolder {
ImageView profile;
TextView name ,message;
public AdapterViewholder(@NonNull View itemView) {
super(itemView);
profile = (ImageView) itemView.findViewById(R.id.profile);
name = (TextView) itemView.findViewById(R.id.name);
message = (TextView) itemView.findViewById(R.id.message);
}
}
}
7.MainActivity와 Adapter 연결
public class MainActivity extends AppCompatActivity {
private ArrayList<Data> Main_dataList; /// 데이터를 담기위한 어레이 리스트
private Adapter Main_adapter; //어댑터
private RecyclerView recyclerview;
private LinearLayoutManager linearLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerview = (RecyclerView) findViewById(R.id.recyclerview); /// 리사이클러뷰 초기화
recyclerview.addItemDecoration(new DividerItemDecoration(getApplicationContext(), DividerItemDecoration.VERTICAL)); ///구분선 넣어주는 옵션
linearLayoutManager = new LinearLayoutManager(this); // 레이아웃 매니져
recyclerview.setLayoutManager(linearLayoutManager); // 리사이클러뷰에 set 해준다 .
Main_dataList = new ArrayList<>(); // 어댑터 선언
Main_adapter = new Adapter(Main_dataList); // 어댑터에 어레이리스트 넣어준다.
recyclerview.setAdapter(Main_adapter);// 리사이클러뷰에 어댑터 set 해준다.
}
}
8. 데이터 넣어주기
여기서는 자신이 원하는 데이터를 넣어주면된다.
저는 그냥 for문을 돌려주었습니다 ;;
package com.example.recyclerview_posting;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ArrayList<Data> Main_dataList; /// 데이터를 담기위한 어레이 리스트
private Adapter Main_adapter; //어댑터
private RecyclerView recyclerview;
private LinearLayoutManager linearLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerview = (RecyclerView) findViewById(R.id.recyclerview); /// 리사이클러뷰 초기화
recyclerview.addItemDecoration(new DividerItemDecoration(getApplicationContext(), DividerItemDecoration.VERTICAL)); ///구분선 넣어주는 옵션
linearLayoutManager = new LinearLayoutManager(this); // 레이아웃 매니져
recyclerview.setLayoutManager(linearLayoutManager); // 리사이클러뷰에 set 해준다 .
Main_dataList = new ArrayList<>(); // 어댑터 선언
Main_adapter = new Adapter(Main_dataList); // 어댑터에 어레이리스트 넣어준다.
recyclerview.setAdapter(Main_adapter);// 리사이클러뷰에 어댑터 set 해준다.
load();
}
void load(){
for (int i =0; i<10; i++) {
Data data = new Data(R.mipmap.ic_launcher_round, i + "번째 사람", i + "번째 상태메시지");
Main_dataList.add(0, data);
Main_adapter.notifyDataSetChanged();
}
}
}
리사이클러뷰 완성 ~
처음엔 어렵지만 익숙해지면 너무 편리한 recyclerview 였습니다.
'안드로이드' 카테고리의 다른 글
FCM 토큰 이용해서 상대방에게 메세지 날리기 (feat.Retrofit) 2편 (0) | 2021.11.10 |
---|---|
FCM 토큰 이용해서 상대방에게 메세지 날리기 (feat.Retrofit) 1편 (0) | 2021.11.09 |
Sharedpreferences 사용해서 자동로그인 기능 추가하기! 2편 (Kotlin) (0) | 2021.10.19 |
Sharedpreferences 사용해서 자동로그인 기능 추가하기! 1편 (Kotlin) (0) | 2021.10.12 |
<Android Studio -JAVA> RecyclerView_item 클릭 (0) | 2021.07.19 |