반응형
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Bbaktaeho

[Android] RecyclerView (리사이클러뷰, 뷰홀더, ViewHolder) 본문

개발 (Develop)/안드로이드 (Android)

[Android] RecyclerView (리사이클러뷰, 뷰홀더, ViewHolder)

Bbaktaeho 2020. 9. 22. 02:13
반응형

RecyclerView


목록을 화면에 출력해주고 동적으로 표현해주는 컨테이너입니다. 

리사이클러뷰는 간단한 코드만으로 ListView, GridView로 바꿀 수 있습니다.

 

가장 복잡한 컨테이너지만 가장 많이 사용되는 것이 바로 리사이클러뷰입니다. 

 

※ 안드로이드 스튜디오 3.1 이후로 ListView, GridView는 Legacy 카테고리로 이동

RecyclerView 맛보기


목록(list)을 표시하는 컨테이너들은 표시될 데이터와 아이템 레이이아웃을 어댑터에서 연결해줍니다.

어댑터는 어떤 레이아웃을 사용하느냐에 따라 표시되는 모양을 다르게 만들 수 있습니다.

여기서 ListView와 RecyclerView의 차이점은 LayerManager 유무의 차이가 있습니다.

LayerManager는 리사이클러뷰를 화면에 보여주는 형태를 결정합니다.

RecyclerView 다운로드

리사이클러뷰를 다운로드합니다.

 

리스트뷰와 비슷해 보입니다.

하지만 어댑터를 사용할 때 리스트뷰와 차이가 있습니다.

아이템 레이아웃 생성하기

layout 우클릭 -> New -> Layout Resource File

이름을 정하고 OK 클릭

하나의 텍스트뷰를 가지는 레이아웃을 생성했습니다.

텍스트뷰의 id는 text입니다.

어댑터 정의하기

리스트뷰에서 어댑터 설정하기

bbaktaeho-95.tistory.com/66

 

[Android] ListView 사용하기 (안드로이드, 리스트뷰, Adapter)

들어가며 ListView를 사용해서 과일 리스트를 나타내 보겠습니다. 각각의 아이템인 과일을 클릭했을 때 이벤트 리스너를 통해서 어떤 아이템이 선택되었는지 TextView에 나타내 보겠습니다. ListView L

bbaktaeho-95.tistory.com

리스트뷰처럼 일반적인 BaseAdapter 클래스와 다르기 때문에 구현이 복잡해집니다.

 

리사이클러뷰에서 어댑터는 RecyclerView.Adapter를 상속해서 구현해야 합니다.

 

// 구현 예시
class 어댑터 extends RecyclerView.Adapter<사용할 뷰홀더 지정> {}
// 기본 형태
public class Adapter extends RecyclerView.Adapter {

    @NonNull
    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return null;
    }


    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }
}

위의 3가지 메서드를 구현해야 합니다.

  • onCreateViewHolder : 뷰홀더를 생성(레이아웃 생성)
  • onBindViewHolder : 뷰홀더가 재활용될 때 실행되는 메서드
  • getItemCount : 아이템 개수를 조회

뷰홀더 (ViewHolder)

리사이클러뷰 어댑터는 개별 데이터에 대응하는 뷰홀더 클래스를 사용합니다.

뷰홀더도 기본 기능이 이미 만들어져 있는 ViewHolder 클래스를 상속받아서 만듭니다. 

ViewHolder는 현재 화면에 보이는 아이템 레이아웃 개수만큼 생성되고 새롭게 그려 저야 할 아이템 레이아웃이 있다면(스크롤 동작) 가장 위의 ViewHolder를 재사용해서 데이터만 바꿉니다.

즉, 몇 천 개의 데이터가 있다고 했을 때 몇 천 개의 아이템 레이아웃을 생성하면 자원 낭비가 있으므로 ViewHolder의 재사용성은 이를 방지하여 앱의 효율을 향상시킵니다.

어댑터 구현하기 Adapter.java

public class Adapter extends RecyclerView.Adapter<Holder> {
    ArrayList<String> list;

    Adapter(ArrayList<String> list) {
        this.list = list;
    }

    @NonNull
    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.item_recycler, parent, false);
        return new Holder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull Holder holder, int position) {
        holder.tv.setText(list.get(position));
    }


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

class Holder extends RecyclerView.ViewHolder {
    TextView tv;

    public Holder(@NonNull View itemView) {
        super(itemView);
        tv = itemView.findViewById(R.id.text);
    }
}

아이템 레이아웃에 텍스트뷰 하나만 있기 때문에 뷰홀더도 텍스트뷰 하나만 다룰 수 있도록 구현했습니다.

 

onCreateViewHolder 메서드에서 LayoutInflater를 사용하는데 이것은 특정 xml 파일을 클래스로 변환하게 도와줍니다.

LayoutInflater는 화면 요소이므로 컨텍스트가 필요하고 inflate 메서드에 레이아웃을 지정해서 호출하면 클래스로 변환됩니다. 변환된 클래스는 Holder 클래스에 담아서 사용합니다.

실행


MainActivity.java

public class MainActivity extends AppCompatActivity {
    ArrayList<String> list;

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

        list = new ArrayList<>();
        list.add("아이템 1");
        list.add("아이템 2");
        list.add("아이템 3");
        list.add("아이템 4");
        list.add("아이템 5");
        list.add("아이템 6");

        Adapter adapter = new Adapter(list);
        RecyclerView recyclerView = findViewById(R.id.recyclerView);

        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);
    }
}

참고 자료


recipes4dev.tistory.com/154

 

안드로이드 리사이클러뷰 기본 사용법. (Android RecyclerView)

1. 안드로이드 리사이클러뷰(RecyclerView) 리사이클러뷰(RecyclerView)는, "많은 수의 데이터 집합을, 제한된 영역 내에서 유연하게(flexible) 표시할 수 있도록 만들어주는 위젯"입니다. [안드로이드 개발

recipes4dev.tistory.com

woovictory.github.io/2019/01/03/Android-Diff-of-ListView-and-RecyclerView/

 

[안드로이드] ListView vs RecyclerView

신입 개발자를 위한 Repository를 만들었습니다. 공부한 내용을 정리 중이니 도움이 되신다면 와서 Star를 눌러주시면 감사하겠습니다. 우리가 사용하는 앱 중에서 가장 많이 등장하는 것은 무엇일�

woovictory.github.io

 

반응형