안드로이드

Adapter 와 Adapter View

Dandiss 2020. 8. 27. 21:16

 

AdapterView 에 항목 나열 화면에 데이터가 나오려면 Adapter 클래스( 뷰는 아니지만 AdapterView 를 만들어주는 클래스 )

 

 

AdapterView 들은 AdapterView 의 서브 클래스들이며

ListView, GridView, Spinner 등이 대표적인 클래스

 

 

* Context : 애플리케이션 레벨에서 시스템 레벨의 기능 및 정보를 이요해야 할 때 , 이용하는 객체

1. ArrayAdapter

한 항목에 문자열 데이터 하나를 순서대로 나열 시 사용

ArrayList<String>

 

2. SimpleAdapter

문자열 여러 개 나열 시 사용

ArrayList<HashMap<String, String>>

 

 

3. CursorAdapter

DBMS 프로그램의 select 결과값을 그대로 이용해 항목을 구성

 

4. Custom Adapter View

개발자 알고리즘대로 항목의 데이터가 설정되어야 할 때 
항목별 뷰의 이벤트를 다르게 처리해야 할 때
항목별 레이아웃을 다르게 적용해야 할 때

 

Adapter 클래스를 만들어야 함.

 

필수 요소

- 라이브러리에서 제공하는 Adapter ( BaseAdapter , ArrayAdapter , SimpleAdapter ) 중 하나를 상속받아야 한다.

 

- Context , 레이아웃 xml 정보 (resId) , 항목 구성 데이터가 액티비티에서 넘어와야 한다. ( 이를 생성자로 구현)

추가적으로 다음 함수들을 구현, 이들은 내부적으로 자동 호출된다.

getCount / getView

public int getCount() {
   
     return datas.size();

}

-getView()

한 항목 구성 시, 자동 호출된다.
이 함수에서 retrun 한 뷰 객체의 계층 구조가 해당 항목에 출력된다.

항목을 구성하기 위해 레이아웃 XML 이 초기화 되어야 함.
초기화된 객체를 findViewById() 함수를 이용해 획득
데이터를 나열하거나 특정 뷰에 이벤트를 등록하거나 레이아웃을 조정해야 함.

 

5. Custom Adapter 고려 사항

이슈 1)  LayoutInflater

레이아웃 초기화는 내부적으로 많은 코드가 실행되어 성능상 부담되는 작업

한 항목이 화면에 구성 할때마다 반복해서 레이아웃 초기화를 할 필요는 없음

레이아웃 XML 항목이 최초로 나오는 순간 한 번만 이루어지게 해주어야 함.

 

해결방법

함수의 두 번째 매개변수인 View convertView 를 이용하여 

null 여부에 따라 레이아웃 초기화 작업 수행

null 이 아니면, getView() 함수에서 반환한 뷰 객체이다.

반환된 뷰는 내부적으로 저장해 두었다가, 해당 항목을 위해 다시 호출될 때 전달해준다.

if(convertView==null) {
	LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = inflater.inflate(resId,null);
    DriveHolder holder=new DriverHolder(convertView);
    convertView.setTag(holder);
 }

 

이슈 2) findViewById

findViewById 함수도 내부적으로 많은 코드가 실행된다.

 

해결방법

무언가를 저장하기 위해 Holder 라는 클래스로 정의할 수 있다.

getView() 함수의 return 객체는 별도 관리할 필요 없이 메모리에 유지해주므로, 이 객체에 담아둔다.

 

public DriveHolder(View root) {
	typeImageView = root.findViewById(R.id.custom_item_type_image);
    titleView = root.findViewById(R.id.custom_item_title);
    dateView = root.findViewById(R.id.custom_item_date);
    ...
}

DriveHolder holder = new DriveHolder(convertView);
convertView.setTag(holder);

 

 

뷰에 데이터 저장하는 방법
- 원래 뷰의 데이터는 일반적으로는 화면 출력을 목적으로 하는 visible 데이터
- 화면과 상관없는 non-visible 데이터를 저장할 수 있다.

데이터를 어딘가에 잠깐 저장해 두었다가 획득해 사용해야 할 때, 메모리에 유지되는 뷰만 있다면 편한 방법

저장 / 획득 방법 : setTag() / getTag()
여러 개를 저장할 경우, setTag(key, value) 함수를 이용 , 획득은 getTag(key) 를 이용

데이터를 저장할 때 자바의 최상위 클래스인 Object 타입으로 캐스팅 되므로, 모든 데이터를 저장할 수 있다.