안드로이드 With Java #21 ListView2
비동기적인 접근이 불가능하다.
Adapter를 사용하는 것
Adapter를 사용하면 사용자 눈에 보이는 만큼만 미리 그려두었다가 사용자가 스크롤을 내리면 새로 받아오고 새로 받아오고 이러한 식으로 ListView를 보여줌
리스트가 들어갈 ListView 컴포넌트를 추가해준다.


이 list_item_view.xml은 리스트 내부에 표기될 아이템 하나하나의 레이아웃을 결정한다.
BaseAdapterAdapterArrayAdapterArrayList에 특화된 AdapterCursorAdapterAdapter등 여러가지 종류가 있다.
모든
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개의 뷰가 재활용되었다. 렌더도 효율적으로 하여 쓸데없이 같은 것을 두번 렌더하지 않는 것 같다.
바뀌는 부분만 새로 재활용한다.