안드로이드 With Java #21 ListView2 (Adapter)

Jake Seo·2020년 8월 12일
0

안드로이드 With Java

목록 보기
21/31

안드로이드 With Java #21 ListView2

AddView를 이용한 ListView의 문제점

  • 모든 item을 add할 때까지 다음 코드가 실행되지 않는다.
    • item이 적을 때는 add 코드가 금방 수행되지만, item이 많다면 성능상 문제가 생길 수 있다.
  • 모든 item을 한번에 다 그린다.
    • 사용자가 실제로 보게 되는 item의 갯수는 한정적일 수 있다. (스크롤을 끝까지 안할 수 있음)

비동기적인 접근이 불가능하다.

문제점 해결 방법

  • Adapter를 사용하는 것

Adapter를 사용하면 사용자 눈에 보이는 만큼만 미리 그려두었다가 사용자가 스크롤을 내리면 새로 받아오고 새로 받아오고 이러한 식으로 ListView를 보여줌

Adapter를 사용하는 것의 장점

  1. Lazy Loading 을 한다.
  • 필요한 부분만 그린다.
  • Inflating 효율을 높일 수 있다.
  1. 데이터 변화를 다시 그리는데 용이하다.

Adapter를 사용하여 ListView 그리기 실습

activity_main.xml에 ListView 컴포넌트 추가하기

리스트가 들어갈 ListView 컴포넌트를 추가해준다.

list_item_view.xml에 TextView 컴포넌트 추가하기

list_item_view.xml은 리스트 내부에 표기될 아이템 하나하나의 레이아웃을 결정한다.

Adapter의 종류

  • BaseAdapter
    • 기본이 되는 Adapter
  • ArrayAdapter
    • ArrayList에 특화된 Adapter
  • CursorAdapter
    • 데이터베이스에 특화된 Adapter

등 여러가지 종류가 있다.

모든 Adapter들은 BaseAdapter를 상속한다. 이번엔 가장 기본이 되는 BaseAdapter를 상속하여 Adapter를 구현해본다.

MainActivity에 MyAdapter 클래스 구현하기

BaseAdapter를 상속하는 MyAdapter 클래스를 구현해보자.

클래스 멤버 변수 만들기

먼저 멤버 변수로는

  1. addView 방식으로 구현했던 ListView에서 item을 그릴 때 썼던 LayoutInflater 가 필요하다.
  2. List를 가지고 있을 ArrayList를 하나 만들어야 한다.

생성자 만들기

생성 단계에서 멤버변수에 값을 넣어줘야 한다.

  • LayoutInflater가 생성되려면 Context를 지정해주어야 하는데, 생성자에서 이 Context를 받아와야 한다.
  • List로 뿌려줄 item들을 받아와야 한다.

완성되면 위와 같은 형태의 코드가 나온다.

여기에 @Override된 메소드들은 BaseAdapter를 상속했을 때 필수적으로 구현되어야 하는 메소드들이다.

필수 메소드 완성하기

위 메소드들은 위에도 구현되어있뜻 구현하기 쉬운 메소드들이다.

getCount()

getCount() 메소드는 총 몇개의 리스트를 갖고 있는지 반환하면 되니까 Listsize() 메소드를 반환하면 된다.

getItem()

getItem() 메소드는 해당 위치에 맞는 아이템을 반환하면 되니까 Listget() 메소드를 이용하면 된다.

getView()

이 메소드가 약간 까다로운데, 여기서는 우리가 adapter를 이용해 view를 어떻게 재활용할지에 대해 정의해주어야 한다.

  1. 먼저 view를 들고 있을 ViewHolder 클래스를 하나 정의해준다.

  1. view가 없다면 viewHolder를 생성하여 setTag() 메소드를 이용한 viewHolder할당을 해주고, view가 있다면 getTag() 메소드를 이용해 ViewHolder를 가져오는 로직을 구현한다.

마지막 setText() 시에는 위에서 구현했던 getItem() 메소드를 활용한다.

ListView의 setAdapter() 메소드를 이용하여 Adapter 설정하기

위와 같이 생성자로 클래스를 인스턴스화 시키고 setAdapter()Adapter를 적용시키면 된다.

결과 확인

Adapter 사용의 이점?

  1. addViewitem을 추가하는 ListView의 경우에는 스크롤 등을 직접 뷰 컴포넌트로 붙여서 더해줘야 하는 반면에, Adapter를 사용한 ListView에서는 스크롤을 제공해준다.

  2. item을 한번에 모두 불러오지 않고 재활용한다.

로그로 진짜 재활용되는지 확인하기

inflater로 진짜 view를 만들 때와 아닌 경우의 로그를 다르게 주어서 한번 확인해보았다.

시작 시

10개의 뷰가 새로 생성되었다.

스크롤을 내릴 시

1개의 뷰가 추가적으로 더 생겨나고 2개의 뷰가 재활용되었다.

다시 스크롤 올릴 시

5개의 뷰가 재활용되었다. 렌더도 효율적으로 하여 쓸데없이 같은 것을 두번 렌더하지 않는 것 같다.

바뀌는 부분만 새로 재활용한다.

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글