자바 안드로이드 앱개발 강좌, 리사이클러 뷰 – 목록 화면 구성

안드로이드 앱 개발에서 리사이클러 뷰(RecyclerView)는 사용자가 데이터를 목록 형태로 효율적으로 볼 수 있도록 도와주는 강력한 UI 위젯입니다. 리사이클러 뷰는 대량의 데이터를 표시하는 데 적합한데, 이는 성능과 메모리 관리 측면에서 최적화되어 있기 때문입니다. 이 강좌에서는 리사이클러 뷰의 개념, 구조, 그리고 실제 예제를 통해 목록 화면을 구성하는 방법에 대해 자세히 알아보겠습니다.

리사이클러 뷰란?

리사이클러 뷰는 안드로이드의 리스트 뷰(ListView)를 발전시킨 형태로, 계속해서 재사용 가능한 뷰 홀더(ViewHolder) 패턴을 활용하여 스크롤 성능을 향상시킵니다. 이는 UI 구성 요소가 화면에 표시될 때만 메모리에 유지되고, 보이지 않는 항목은 메모리에서 해제해 성능 개선을 도와줍니다.

리사이클러 뷰 구성 요소

  • 어댑터(Adapter): 데이터와 뷰를 연결하는 역할을 하며, 뷰 항목을 생성하고 데이터를 해당 뷰에 바인딩합니다.
  • 뷰 홀더(ViewHolder): 각 아이템의 뷰를 재사용할 수 있게 해 주는 객체로, UI의 상태를 저장합니다.
  • 레이아웃 관리자(LayoutManager): 아이템의 위치를 관리하며, 수직 또는 수평 스크롤을 지원합니다.

리사이클러 뷰의 장점

  • 효율적인 메모리 사용: 뷰 홀더 패턴을 통해 메모리 사용을 최소화합니다.
  • 유연한 레이아웃: 수직, 수평 또는 그리드 형식 등 다양한 레이아웃으로 구성할 수 있습니다.
  • 성능: 빠른 스크롤링 성능을 제공합니다.

리사이클러 뷰 기본 구성 요소 구현하기

1. Gradle 의존성 추가

리사이클러 뷰를 사용하기 위해서는 먼저 build.gradle 파일에 의존성을 추가해야 합니다.

dependencies {
    implementation "androidx.recyclerview:recyclerview:1.2.1"
}

2. 레이아웃 파일 생성

리사이클러 뷰를 사용할 액티비티 또는 프래그먼트의 XML 레이아웃 파일을 작성합니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

3. 데이터 모델 생성

리사이클러 뷰에서 사용할 데이터 모델 클래스를 생성합니다.

public class Item {
    private String title;
    private String description;

    public Item(String title, String description) {
        this.title = title;
        this.description = description;
    }

    public String getTitle() {
        return title;
    }

    public String getDescription() {
        return description;
    }
}

4. 어댑터 클래스 작성

리사이클러 뷰와 데이터 모델을 연결하기 위해 어댑터 클래스를 작성합니다.

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;

public class ItemAdapter extends RecyclerView.Adapter {
    private final List itemList;

    public ItemAdapter(List itemList) {
        this.itemList = itemList;
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
        Item currentItem = itemList.get(position);
        holder.title.setText(currentItem.getTitle());
        holder.description.setText(currentItem.getDescription());
    }

    @Override
    public int getItemCount() {
        return itemList.size();
    }

    public static class ItemViewHolder extends RecyclerView.ViewHolder {
        public final TextView title;
        public final TextView description;

        public ItemViewHolder(View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.item_title);
            description = itemView.findViewById(R.id.item_description);
        }
    }
}

5. 아이템 레이아웃 파일 생성

각 아이템을 표시하기 위한 레이아웃 파일을 생성합니다.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/item_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textStyle="bold"/>

    <TextView
        android:id="@+id/item_description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="14sp"/>

</LinearLayout>

6. 메인 액티비티에서 리사이클러 뷰 설정

마지막으로, 메인 액티비티에서 리사이클러 뷰를 설정하고 데이터를 표시합니다.

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    private ItemAdapter itemAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        List itemList = new ArrayList<>();
        itemList.add(new Item("아이템 1", "설명 1"));
        itemList.add(new Item("아이템 2", "설명 2"));
        itemList.add(new Item("아이템 3", "설명 3"));

        itemAdapter = new ItemAdapter(itemList);
        recyclerView.setAdapter(itemAdapter);
    }
}

리사이클러 뷰의 고급 기능

1. 아이템 클릭 리스너 추가

아이템 클릭 이벤트를 처리하기 위해 어댑터에 클릭 리스너를 추가할 수 있습니다.

public class ItemAdapter extends RecyclerView.Adapter {
    private final List itemList;
    private final OnItemClickListener listener;

    public interface OnItemClickListener {
        void onItemClick(Item item);
    }

    public ItemAdapter(List itemList, OnItemClickListener listener) {
        this.itemList = itemList;
        this.listener = listener;
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
        return new ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
        Item currentItem = itemList.get(position);
        holder.title.setText(currentItem.getTitle());
        holder.description.setText(currentItem.getDescription());
        
        holder.itemView.setOnClickListener(v -> listener.onItemClick(currentItem));
    }

    public static class ItemViewHolder extends RecyclerView.ViewHolder {
        public final TextView title;
        public final TextView description;

        public ItemViewHolder(View itemView) {
            super(itemView);
            title = itemView.findViewById(R.id.item_title);
            description = itemView.findViewById(R.id.item_description);
        }
    }
}

2. 아이템 추가 및 삭제

리사이클러 뷰에 아이템을 추가 및 삭제하는 방법을 알아보겠습니다.

public void addItem(Item item) {
    itemList.add(item);
    notifyItemInserted(itemList.size() - 1);
}

public void removeItem(int position) {
    itemList.remove(position);
    notifyItemRemoved(position);
}

3. 애니메이션 효과 추가

리사이클러 뷰는 기본적으로 기본 애니메이션을 지원하지만, 커스텀 애니메이션을 추가하여 더욱 다채로운 효과를 줄 수 있습니다.

결론

리사이클러 뷰는 안드로이드 앱 개발에서 필수적으로 알아야 할 UI 요소 중 하나입니다. 이 강좌를 통해 리사이클러 뷰의 기본 개념과 구현 방법을 이해하셨기를 바랍니다. 리사이클러 뷰는 대량의 데이터를 효율적으로 표시할 수 있도록 해 주며, 다양한 기능을 통해 사용자 경험을 향상시킬 수 있습니다. 여러분의 안드로이드 앱 개발에 많은 도움이 되길 바랍니다.