Fragment와 RecyclerView.Adapter의 차이
Fragment: 안드로이드에서 화면의 특정 부분을 구성하는 컴포넌트입니다. 하나의 액티비티(Activity) 안에 여러 프래그먼트를 넣어서 다양한 화면을 보여줄 수 있습니다. Fragment는 UI 요소와 상호작용하거나, 사용자에게 화면을 제공하는데 쓰입니다.
RecyclerView.Adapter: 리스트 또는 그리드처럼 반복되는 데이터를 화면에 보여주는 역할을 합니다. 데이터를 화면에 그릴 때 각각의 아이템을 효율적으로 관리하고, 스크롤할 때 성능을 최적화합니다.
중요한 점: Fragment는 화면의 특정 부분을 나타내는 반면, Adapter는 데이터를 화면에 뿌려주는 도구입니다. Adapter를 사용한다고 해서 Fragment를 사용하지 않을 수는 없지만, 상황에 따라 RecyclerView.Adapter만으로도 리스트를 처리할 수 있습니다. 리스트 화면을 만들기 위해 꼭 Fragment가 필요한 것은 아닙니다.
Adapter란?
Adapter는 RecyclerView와 같은 UI 컴포넌트에서 데이터를 화면에 표시하기 위해 사용하는 중개자입니다. 데이터를 받아서 RecyclerView에 하나씩 그려주는 역할을 합니다.
데이터를 어떻게 표시할지 결정하는 뷰를 생성.
스크롤할 때 성능을 높이기 위해 재사용할 수 있는 뷰들을 관리.
ListItem 클래스란?
ListItem은 데이터를 저장하는 모델 클래스입니다. 주로 앱에서 사용할 데이터를 객체로 관리하기 위해 클래스 형태로 만듭니다. 예를 들어, 리스트의 각 항목이 '문장형 (4지 1답)', '사진형 (5지 2답)' 등의 정보와 진행 상태를 가지고 있다면, 이 정보를 각각 ListItem 객체로 만들어서 관리합니다.
이 클래스를 만드는 이유는 데이터를 구조적으로 관리하기 위함입니다. 데이터가 많아질 때, 이를 각각 변수로 관리하면 복잡해지기 때문에 하나의 클래스에 정보를 담아서 쉽게 다루고, 이 데이터를 Adapter에 전달하여 화면에 표시하는 것입니다.
RecyclerView.Adapter와 ViewHolder 설명
RecyclerView.Adapter: RecyclerView의 아이템을 관리하는 클래스입니다. 데이터를 받아서 아이템 뷰에 그릴 수 있도록 onCreateViewHolder(), onBindViewHolder(), getItemCount() 같은 메서드를 구현합니다.
ViewHolder: 아이템의 뷰를 관리하는 클래스입니다. Adapter는 ViewHolder를 통해 아이템에 표시할 데이터를 뷰에 바인딩합니다.
RecyclerView.Adapter 기본 구조
public class CategoriesAdapter extends RecyclerView.Adapter<CategoriesAdapter.ItemViewHolder> {
// ListItem 타입의 리스트를 어댑터가 가지고 있음
private ArrayList<ListItem> listItems;
// 생성자를 통해 데이터를 받아옴
public CategoriesAdapter(ArrayList<ListItem> listItems) {
this.listItems = listItems;
}
// ViewHolder를 생성 (item의 레이아웃을 inflate)
@NonNull
@Override
public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
return new ItemViewHolder(view);
}
// 데이터를 ViewHolder에 바인딩 (아이템 뷰에 데이터를 설정)
@Override
public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
ListItem item = listItems.get(position);
holder.title.setText(item.getTitle());
holder.progressText.setText(item.getProgress() + " / 100");
holder.progressBar.setProgress(item.getProgress());
}
// 전체 아이템의 개수를 반환
@Override
public int getItemCount() {
return listItems.size();
}
// ViewHolder: 아이템 뷰의 데이터를 관리하는 클래스
public static class ItemViewHolder extends RecyclerView.ViewHolder {
TextView title, progressText;
ProgressBar progressBar;
public ItemViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.item_title);
progressText = itemView.findViewById(R.id.item_progress_text);
progressBar = itemView.findViewById(R.id.item_progress_bar);
}
}
}
플래그먼트에 RecyclerView 적용 예시
이제 위의 어댑터를 Fragment에 적용해 보겠습니다.
CategoriesFragment.java
public class CategoriesFragment extends Fragment {
private RecyclerView recyclerView;
private CategoriesAdapter categoriesAdapter;
private ArrayList<ListItem> listItems;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
// 프래그먼트의 레이아웃을 inflate
View view = inflater.inflate(R.layout.fragment_categories, container, false);
// RecyclerView 설정
recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
// 데이터 준비 (ListItem 객체로 리스트 생성)
listItems = new ArrayList<>();
listItems.add(new ListItem("문장형 (4지 1답)", 85));
listItems.add(new ListItem("사진형 (5지 2답)", 90));
// 어댑터 설정
categoriesAdapter = new CategoriesAdapter(listItems);
recyclerView.setAdapter(categoriesAdapter);
return view;
}
}
fragment_categories.xml
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- RecyclerView -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</androidx.constraintlayout.widget.ConstraintLayout>
앞으로 자바와 안드로이드에서 RecyclerView와 Adapter를 사용할 때는, 데이터를 모델 클래스(ListItem)로 구조화한 후 어댑터를 통해 그 데이터를 화면에 표시하는 작업 흐름을 이해하면 더 쉽게 다가갈 수 있을 것입니다.