Fragment와 RecyclerView.Adapter의 차이

심재·2024년 9월 19일
0
post-custom-banner
  1. Fragment와 RecyclerView.Adapter의 차이
    Fragment: 안드로이드에서 화면의 특정 부분을 구성하는 컴포넌트입니다. 하나의 액티비티(Activity) 안에 여러 프래그먼트를 넣어서 다양한 화면을 보여줄 수 있습니다. Fragment는 UI 요소와 상호작용하거나, 사용자에게 화면을 제공하는데 쓰입니다.

    RecyclerView.Adapter: 리스트 또는 그리드처럼 반복되는 데이터를 화면에 보여주는 역할을 합니다. 데이터를 화면에 그릴 때 각각의 아이템을 효율적으로 관리하고, 스크롤할 때 성능을 최적화합니다.
    중요한 점: Fragment는 화면의 특정 부분을 나타내는 반면, Adapter는 데이터를 화면에 뿌려주는 도구입니다. Adapter를 사용한다고 해서 Fragment를 사용하지 않을 수는 없지만, 상황에 따라 RecyclerView.Adapter만으로도 리스트를 처리할 수 있습니다. 리스트 화면을 만들기 위해 꼭 Fragment가 필요한 것은 아닙니다.

  2. Adapter란?
    Adapter는 RecyclerView와 같은 UI 컴포넌트에서 데이터를 화면에 표시하기 위해 사용하는 중개자입니다. 데이터를 받아서 RecyclerView에 하나씩 그려주는 역할을 합니다.

    데이터를 어떻게 표시할지 결정하는 뷰를 생성.
    스크롤할 때 성능을 높이기 위해 재사용할 수 있는 뷰들을 관리.

  3. ListItem 클래스란?
    ListItem은 데이터를 저장하는 모델 클래스입니다. 주로 앱에서 사용할 데이터를 객체로 관리하기 위해 클래스 형태로 만듭니다. 예를 들어, 리스트의 각 항목이 '문장형 (4지 1답)', '사진형 (5지 2답)' 등의 정보와 진행 상태를 가지고 있다면, 이 정보를 각각 ListItem 객체로 만들어서 관리합니다.

    이 클래스를 만드는 이유는 데이터를 구조적으로 관리하기 위함입니다. 데이터가 많아질 때, 이를 각각 변수로 관리하면 복잡해지기 때문에 하나의 클래스에 정보를 담아서 쉽게 다루고, 이 데이터를 Adapter에 전달하여 화면에 표시하는 것입니다.

  4. RecyclerView.Adapter와 ViewHolder 설명
    RecyclerView.Adapter: RecyclerView의 아이템을 관리하는 클래스입니다. 데이터를 받아서 아이템 뷰에 그릴 수 있도록 onCreateViewHolder(), onBindViewHolder(), getItemCount() 같은 메서드를 구현합니다.

    ViewHolder: 아이템의 뷰를 관리하는 클래스입니다. Adapter는 ViewHolder를 통해 아이템에 표시할 데이터를 뷰에 바인딩합니다.

  5. 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);
            }
        }
    }
    
  1. 플래그먼트에 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>
  1. 전체 흐름 요약
    ListItem: 데이터(타이틀, 진행률)를 관리하는 모델 클래스입니다.
    CategoriesAdapter: ListItem 데이터를 RecyclerView에 바인딩해 주는 클래스입니다. 아이템이 화면에 어떻게 보일지 정의합니다.
    CategoriesFragment: RecyclerView를 사용해서 리스트를 화면에 표시하는 곳입니다.
    RecyclerView는 각 아이템을 효율적으로 그리기 위해 어댑터와 데이터를 받아 아이템을 화면에 표시합니다.
    결론:
    자바는 객체 지향 언어라서 데이터를 잘 구조화하여 관리하는 것이 중요합니다. ListItem 클래스는 데이터를 담고, Adapter는 그 데이터를 기반으로 UI에 그리는 중개 역할을 하며, RecyclerView는 그 데이터 리스트를 효율적으로 관리합니다.

앞으로 자바와 안드로이드에서 RecyclerView와 Adapter를 사용할 때는, 데이터를 모델 클래스(ListItem)로 구조화한 후 어댑터를 통해 그 데이터를 화면에 표시하는 작업 흐름을 이해하면 더 쉽게 다가갈 수 있을 것입니다.

profile
언제나 개발중
post-custom-banner

0개의 댓글