반응형
■RecyclerView사용법
리사이클러뷰는 대량의 데이터의 집합을 효율적으로 화면에 나타내기 위해서, 각 아이템을 목록형태로
화면에 보여주는 위젯이다.
- Layout Manager- Item 뷰가 나열되는 형태(수평, 수작, 그리드)를 관리하기 위한 요소를 제공한다.
- Item - 화면에 표시할 실질적인 item리스트 (데이터)
- Adapter - Item(데이터)을 View와 연결해서 뷰(View) 생성 및 관리하는 객체
- ViewHolder - 화면에 표시될 Item 뷰를 생성 또는 재활용하는 객체
Adapter 를 통해 만들어진 각 Item 은 ViewHolder 에 저장되어 화면에 표시되고, 필요에 따라 생성 또는 재활용 !!!!
즉, 스크롤을 내릴 때 이미 만들어진 ViewHolder가 존재한다면 Item만 바인딩시켜서 사용된다.
=>ViewHolder의 Recycle(재활용)
✅작성 순서
1. [activity_main.xml] XML 파일에 RecyclerView를 작성한다.
2. itemView 레이아웃 구성을 위해 XML 생성한다.
3. itemView 에 표시될 데이터를 저장할 Class 생성한다
4. Adapter Class를 만든다.
5. LayoutManager와 Adapter 객체를 RecyclerView에 연결한다
■RecyclerView사용예제 (feat. 홍드로이드)
1. [activity_main.xml] XML 파일에 RecyclerView를 작성한다.
RecyclerView가표시될 위치를 결정하기 위해 메인액티비티에 표시한다.
- 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"
android:orientation="vertical"
android:layout_margin = "10dp"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id = "@+id/rv"
android:layout_width ="match_parent"
android:layout_height = "match_parent"
android:scrollbarSize = "5dp"
android:scrollbarFadeDuration ="0"
android:scrollbarThumbVertical="@android:color/darker_gray"
android:scrollbars = "vertical"
android:layout_weight = "1"
></androidx.recyclerview.widget.RecyclerView>
<Button
android:id = "@+id/btnAdd"
android:layout_width="match_parent"
android:layout_height = "wrap_content"
android:text = "항목추가"
></Button>
</LinearLayout>
2. itemView 레이아웃 구성을 위해 XML 생성한다.
RecyclerView에 표시될 각 Item뷰가 어떻게 표시될지 레이아웃 작성
[res] -[layout]에 [item.xml] 생성
- item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<ImageView
android:id="@+id/profile"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:src ="@mipmap/ic_launcher"
></ImageView>
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:gravity ="center_vertical"
android:orientation ="vertical"
>
<TextView
android:id ="@+id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text ="안드로이드"
></TextView>
<TextView
android:id ="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text ="리사이클러뷰"
></TextView>
</LinearLayout>
</LinearLayout>
</LinearLayout>
3. itemView 에 표시될 데이터를 저장할 Class 생성
[java] - [MainData.java] 생성
Alt + Insert 하여 Constructor 와 Getter and Setter 추가
package com.androidpark.recycelrView;
public class MainData {
private int iv_profile;
private String tv_name,tv_content;
//alt + insert 키 -> constructor
public MainData(int iv_profile, String tv_name, String tv_content) {
this.iv_profile = iv_profile;
this.tv_name = tv_name;
this.tv_content = tv_content;
}
//alt + insert 키 -> getter and setter
public int getIv_profile() {
return iv_profile;
}
public void setIv_profile(int iv_profile) {
this.iv_profile = iv_profile;
}
public String getTv_name() {
return tv_name;
}
public void setTv_name(String tv_name) {
this.tv_name = tv_name;
}
public String getTv_content() {
return tv_content;
}
public void setTv_content(String tv_content) {
this.tv_content = tv_content;
}
}
4. Adapter Class를 만든다.
RecyclerView.Adapter를 상속받는 새로운 Adapter 를 생성한다.
이때 오버라이드가 필요한 메서드는 아래의 3가지가 있다.
- onCreateViewHolder(ViewGroup parent, int viewType)
- onBindViewHolder(ViewHolder holder, int position)
- getItemCount()
[java] - [MainAdapter.java] 생성
-MainAdaoter.java
package com.androidpark.recycelrView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Queue;
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.CustomViewHolder> {
//Item들을 담을 배열 list 생성
private ArrayList<MainData> arrayList;
public MainAdapter(ArrayList<MainData> arrayList) {
this.arrayList = arrayList;
}
@NonNull
@Override
// viewType 형태의 아이템 뷰를 위한 뷰홀더 객체 생성 =>화면 출력 최초에 생성될 때 생명주기를 의미
public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
CustomViewHolder holder = new CustomViewHolder(view);
return holder;
}
@Override
//position(위치)에 해당하는 데이터를 뷰홀더의 아이템뷰에 표시.
public void onBindViewHolder(@NonNull CustomViewHolder holder, int position) {
holder.iv_profile.setImageResource(arrayList.get(position).getIv_profile());
holder.tv_name.setText(arrayList.get(position).getTv_name());
holder.tv_content.setText(arrayList.get(position).getTv_content());
holder.itemView.setTag(position);
//viewHolder 클릭 시 이벤트 구현
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String curName = holder.tv_name.getText().toString();
Toast.makeText(view.getContext(), "curName", Toast.LENGTH_SHORT).show();
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
remove(holder.getAdapterPosition());
return true;
}
});
}
@Override
//전체 아이템 갯수 리턴
public int getItemCount() {
return (null != arrayList ? arrayList.size() : 0);
}
public void remove(int position) {
try {
arrayList.remove(position);
notifyItemRemoved(position);
} catch (IndexOutOfBoundsException ex) {
ex.printStackTrace();
}
}
public class CustomViewHolder extends RecyclerView.ViewHolder {
//
protected ImageView iv_profile;
protected TextView tv_name;
protected TextView tv_content;
public CustomViewHolder(@NonNull View itemView) {
super(itemView);
this.iv_profile = (ImageView) itemView.findViewById(R.id.profile);
this.tv_name = (TextView) itemView.findViewById(R.id.tv_name);
this.tv_content = (TextView) itemView.findViewById(R.id.tv_content);
}
}
}
5. LayoutManager와 Adapter 객체를 RecyclerView에 연결
- MainActivity.java
package com.androidpark.recyclerview;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ArrayList<MainData> arrayList;
private MainAdapter mainAdapter;
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.rv);
//LayoutManager를 RecyclerView에 연결
linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
//Adapter 객체를 RecyclerView에 연결
arrayList = new ArrayList<>();
mainAdapter = new MainAdapter(arrayList);
recyclerView.setAdapter(mainAdapter);
Button btnAdd = (Button) findViewById(R.id.btnAdd);
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MainData mainData = new MainData(R.mipmap.ic_launcher,"안드로이드","리사이클러뷰");
arrayList.add(mainData);
mainAdapter.notifyDataSetChanged();
}
});
}
}
참고: https://www.youtube.com/watch?v=kNq9w1_nhL4&list=PLC51MBz7PMyyyR2l4gGBMFMMUfYmBkZxm&index=13
반응형
'Adroid Studio' 카테고리의 다른 글
Android Studio_안드로이드 스튜디오_4대컴포넌트_액티비티-1 (0) | 2022.08.26 |
---|---|
Android Studio_옵션메뉴와 컨택스트 메뉴 차이 (0) | 2022.08.26 |
Android Studio_안드로이드 스튜디오_간단한 리스트 만들기1(ListView) (0) | 2022.08.25 |
Android Studio_안드로이드 스튜디오_간단한 웹브라우저 만들기 (0) | 2022.08.25 |
Android Studio_안드로이드 스튜디오 앱 만들기5_레이아웃의 개요 (0) | 2022.08.22 |