카테고리 없음

자바(JAVA)기반 안드로이드 웹&앱 개발 43일차 (리싸이클러뷰, 스피너)

의창s 2021. 4. 29. 20:28

어제 못올린 예시를 올리느라.. 오늘 예시를 아직 못했습니다.

운동 갔다와서 시간되면 올리겠습니다.

[리싸이클러뷰 만들기]

1. 모바일 단말에서 가장 많이 사용되는 UI 모양 중의 하나가 바로 리스트입니다. 리스트는 일반적으로 여러 개의 아이템 중 하나를 선택할 수 있는 세로 모양으로 된 화면 컨트롤(Control)을 말하는데 이런 UI 모양은 다른 언어에서도 많이 사용됩니다.

2. 안드로이드에서는 여러 개의 아이템 중에 하나를 선택할 수 있는 리스트 모양의 위젯을 특별히 ’선택 위젯(Selection Widget)'이라고 부릅니다.

★ 선택 위젯이라는 이름으로 구분하는 이유

☞ 선택 위젯이 어댑터(Adpater) 패턴을 사용하기 때문입니다. 선택 위젯에 데이터를 넣을 때 위젯이 아닌 어댑터에 설정해야 하며 화면에 보이는 뷰도 어댑터에서 만듭니다. 즉, 리스트 모양의 뷰에 보이는 각각의 아이템은 뷰가 아닌 어댑터에서 관리합니다.

3. 원본 데이터는 어댑터에 설정해야 하며 어댑터가 데이터 관리 기능을 담당합니다.

4. 선택 위젯에 보이는 각각의 아이템이 화면에 디스플레이되기 전에 어댑터의 getView() 메서드가 호출됩니다. 이 메서드에서 반환하는 뷰가 하나의 아이템으로 디스플레이 됩니다.

5. 리스트 모양으로 보여줄 수 있는 위젯으로 리싸이클러뷰(RecyclerView)가 있습니다. 또한, 각각의 아이템이 화면에 보일 때 메모리를 효율적으로 사용하도록 캐시(Cache) 메커니즘이 구현되어 있습니다.

※ 리싸이클러뷰 예시

 

☞ 리싸이클러뷰는 선택 위젯이기 때문에 어댑터가 데이터 관리와 뷰 객체 관리를 담당합니다. 즉, 리싸이클러뷰는 껍데기라고 생각하시면 됩니다.

☞ 어댑터 안에 들어갈 아이템의 데이터를 담아둘 클래스를 하나 정의합니다.(Person)

☞ 리스트 형태로 보일 때 각각의 아이템은 뷰로 만들어지며 각각의 아이템을 위한 뷰는 뷰홀더에 담아두게 됩니다. 이 뷰홀더 역할을 하는 클래스(ViewHoler)를 PersonAdapter 클래스 안에 넣어둔다고 생각하면 됩니다.

☞ RecyclerView.ViewHolder 클래스를 상속하여 정의된 ViewHolder 클래스의 생성자에는 뷰 객체가 전달됩니다. 그리고 전달 받은 이 객체를 부모 클래스의 변수에 담아두게 되는데 생성자 안에서 super() 메서드를 호출하면 됩니다.

☞ 어댑터에 구현되어야 하는 중요한 메서드는 3가지입니다.

★ getItemcount() : 어댑터에서 관리하는 아이템의 개수를 반환

★ onCreateViewHolder() : 뷰홀더 객체가 만들어질 때 자동으로 호출

..☞ 뷰 타입을 위한 정수값이 파라미터로 전달됩니다.

..☞ 인플레이션을 진행하기 위해서 Context 객체가 필요한데 파라미터로 전달되는 뷰그룹 객체의 getContext() 메서드를 이용하면 Context 객체를 참조할 수 있습니다.

★ onBindViewHolder() : 뷰홀더 객체가 재상용될 때 자동으로 호출 (캐시형식)

☞ 어댑터가 ArrayList 안에 들어 있는 전체 아이템의 개수를 알아야 하므로 getItemCount() 메서드는 ArrayList의 size() 메서드를 호출하여 전체 아이템이 몇개인지를 확인한 후 그 값을 반환합니다.

☞ 여기에서 person_item.xml 의 소스코드가 따로 필요없는 이유는 이 XML 레이아웃을 ViewGroup 객체에 인플레이션한 후 ViewHolder 객체에 넣어두기 때문입니다.

☞ 어댑터가 각각의 아이템을 위한 Person 객체를 ArrayList 안에 넣어 관리하기 때문에 이 어댑터를 사용하는 소스 코드에서 어댑터에 Person 객체를 넣거나 가져갈 수 있도록 addItem(), setItems(), getItem(), setItem() 메서드를 PersonAdapter 에 추가합니다.

☞ LayoutManager 는 리싸클러뷰가 보일 기본적인 형태를 설정할 때 사용합니다.

 

[GridLayout 리싸이클러와 리싸이클러 뷰를 클릭했을 때, 토스트 뷰가 나타나게하기]

※ GridLayout 리싸이클러와 리싸이클러 뷰를 클릭했을 때, 토스트 뷰가 나타나게하기 예시

 

☞ 클릭 이벤트는 리싸이클러뷰가 아니라 각 아이템에 발생하게 되므로 뷰홀더 안에서 클릭 이벤트를 처리할 수 있도록 하는 것이 좋습니다.

☞ 뷰 홀더의 생성자로 뷰 객체가 전달되므로 이 뷰 객체에 OnClickListener를 설정합니다. 그러면 이 뷰를 클릭했을 때 그 리스너의 onClick() 메서드가 호출됩니다.

☞ 그런데, 이 리스너 안에서 토스트 메시지를 띄우게 되면 클릭했을 때의 기능이 변경될 때마다 어댑터를 수정해야 하는 문제가 생깁니다. 따라서 어댑터 객체 밖에서 리스너를 설정하고 설정된 리스너 쪽으로 이벤트를 전달받도록 하는 것이 좋습니다.

☞ 어댑터 클래스 안에서가 아니라 밖에서 이벤트 처리를 하는 것이 일반적이므로 listener 라는 이름의 변수를 하나 선언하고 setOnItemClickListener() 메서드를 추가하여 이 메서드가 호출되었을 때 다시 외부에서 설정된 메서드가 호출되도록 만들 수 있습니다. 이렇게 하면 onItemClick() 메서드가 호출 되었을 때 다시 외부에서 설정된 메서드가 호출되도록 만들 수 있습니다.

☞ 어댑터 객체에는 setOnItemClickListener() 메서드를 호출하면서 리스너 객체를 설정했습니다. 이렇게 하면 각 아이템이 클릭되었을 때 이 리스너의 onItemClick() 메서드가 호출됩니다.

 

[스피너 사용하기(선택위젯 중 하나)]

1. 스피너는 일반적으로 윈도우에서 콤보박스로 불립니다.

※ 스피너 사용 예시

 

☞ 스피너 객체도 선택 위젯이므로 setAdapter() 메서드의 파라미터로 어댑터 객체를 전달해야 합니다. API에서 제공하는 기본어댑터들을 활용해서 ArrayAdapter로 배열로 된 데이터를 아이템으로 추가할 때 사용합니다.

☞ setDropDownViewResource() 메서드는 스피너의 각 아이템들을 보여줄 뷰에 사용되는 레이아웃을 지정하는 데 사용되며 안드로이드에서 미리 정의한 리소스인 android.R.layout.simple_spinner_dropdown_item 값을 전달하면 가장 단순한 형태의 뷰가 보이게 됩니다.