안드로이드 With Java #21 ListView2
비동기적인 접근이 불가능하다.
Adapter
를 사용하는 것Adapter
를 사용하면 사용자 눈에 보이는 만큼만 미리 그려두었다가 사용자가 스크롤을 내리면 새로 받아오고 새로 받아오고 이러한 식으로 ListView
를 보여줌
리스트가 들어갈 ListView
컴포넌트를 추가해준다.
이 list_item_view.xml
은 리스트 내부에 표기될 아이템 하나하나의 레이아웃을 결정한다.
BaseAdapter
Adapter
ArrayAdapter
ArrayList
에 특화된 Adapter
CursorAdapter
Adapter
등 여러가지 종류가 있다.
모든
Adapter
들은BaseAdapter
를 상속한다. 이번엔 가장 기본이 되는BaseAdapter
를 상속하여Adapter
를 구현해본다.
BaseAdapter
를 상속하는 MyAdapter
클래스를 구현해보자.
먼저 멤버 변수로는
addView
방식으로 구현했던 ListView
에서 item
을 그릴 때 썼던 LayoutInflater
가 필요하다.List
를 가지고 있을 ArrayList
를 하나 만들어야 한다.생성 단계에서 멤버변수에 값을 넣어줘야 한다.
LayoutInflater
가 생성되려면 Context
를 지정해주어야 하는데, 생성자에서 이 Context
를 받아와야 한다.List
로 뿌려줄 item
들을 받아와야 한다.완성되면 위와 같은 형태의 코드가 나온다.
여기에 @Override
된 메소드들은 BaseAdapter
를 상속했을 때 필수적으로 구현되어야 하는 메소드들이다.
위 메소드들은 위에도 구현되어있뜻 구현하기 쉬운 메소드들이다.
getCount()
메소드는 총 몇개의 리스트를 갖고 있는지 반환하면 되니까 List
의 size()
메소드를 반환하면 된다.
getItem()
메소드는 해당 위치에 맞는 아이템을 반환하면 되니까 List
의 get()
메소드를 이용하면 된다.
이 메소드가 약간 까다로운데, 여기서는 우리가 adapter
를 이용해 view
를 어떻게 재활용할지에 대해 정의해주어야 한다.
view
를 들고 있을 ViewHolder
클래스를 하나 정의해준다.view
가 없다면 viewHolder
를 생성하여 setTag()
메소드를 이용한 viewHolder
할당을 해주고, view
가 있다면 getTag()
메소드를 이용해 ViewHolder
를 가져오는 로직을 구현한다.마지막 setText()
시에는 위에서 구현했던 getItem()
메소드를 활용한다.
위와 같이 생성자로 클래스를 인스턴스화 시키고 setAdapter()
로 Adapter
를 적용시키면 된다.
addView
로 item
을 추가하는 ListView
의 경우에는 스크롤 등을 직접 뷰 컴포넌트로 붙여서 더해줘야 하는 반면에, Adapter
를 사용한 ListView
에서는 스크롤을 제공해준다.
item
을 한번에 모두 불러오지 않고 재활용한다.
inflater
로 진짜 view
를 만들 때와 아닌 경우의 로그를 다르게 주어서 한번 확인해보았다.
10개의 뷰가 새로 생성되었다.
1개의 뷰가 추가적으로 더 생겨나고 2개의 뷰가 재활용되었다.
5개의 뷰가 재활용되었다. 렌더도 효율적으로 하여 쓸데없이 같은 것을 두번 렌더하지 않는 것 같다.
바뀌는 부분만 새로 재활용한다.