1. CustomAdapter란?
- 리스트뷰를 사용할 때 특별한 기능을 추가해서 만들고 싶다면 Adapter 클래스를 직접 만들어 사용하면 된다.
- Adapter 클래스를 만들 때는 BaseAdapter 클래스를 상속받아 작성한다.
2. 주요 메서드
getCount : 리스트뷰 내의 전체 항목의 개수를 반환한다.
getView: 리스트 뷰 항목 하나를 구성하여 반환한다. (항목 하나의 모양)
리스트 뷰 항목 하나를 구성하기 위해 호출되는 메서드.
이 함수로 리턴되는 View로 리스트뷰 항목 하나를 구성.
예를들어 100만개의 항목 중 7개만 화면에 보인다고 하면 초기화 시에 7번 호출되었다가
스크롤 내리면서 새롭게 나타나는것만큼 그 항목을 구성하기 위해 호출된다.
이 때 보였다가 안보이게된 View는 재사용성을 위해 2번째 인자인 convertView로 넘어온다.
convertView가 null이 아니라면 재사용 가능, 없다면 layoutInflater로 생성해준다.
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
var p1:View? = convertView
if(p1 == null)
{
p1 = layoutInflater.inflate(R.layout.row, null)
}
// 항목에서 발생할 이벤트에 관련된 View들을 가져온다.
var textView:TextView? = p1?.findViewById<TextView>(R.id.textView2)
var button1:Button? = p1?.findViewById<Button>(R.id.button);
var button2:Button? = p1?.findViewById<Button>(R.id.button2);
예제에서 n번째 버튼이 눌리면 발생하는 이벤트를 만들고싶은데,
안드로이드OS가 이게 몇번째 버튼인지 알 수 있는 방법이 없다.
따라서 이 함수에서 ButtonView의 tag 항목에 이 버튼이 리스트뷰의 몇번째 항목인지 전달해준다.
버튼 객체 안에다가 tag 항목을 넣어놨기 때문에
리스너의 OnClick()에서 넘어가는 ButtonView에 tag값으로 보내준다.
button1?.tag = position
button2?.tag = position
//버튼 이벤트를위해 리스너 세팅
button1?.setOnClickListener(listner);
button2?.setOnClickListener(listner);
textView?.text = data[position]
return p1
}
3. 커스텀 어뎁터 예시
inner class ListAdapter : BaseAdapter()
{
var listner = BtnListenr();
override fun getCount(): Int {
return data.size
}
override fun getItem(position: Int): Any? {
return null
}
override fun getItemId(position: Int): Long {
return 0
}
/*
리스트 뷰 항목 하나를 구성하기 위해 호출되는 메서드.
이 함수로 리턴되는 View로 리스트뷰 항목 하나를 구성.
예를들어 100만개의 항목 중 7개만 화면에 보인다고 하면 초기화 시에 7번 호출되었다가
스크롤 내리면서 새롭게 나타나는것만큼 그 항목을 구성하기 위해 호출된다.
이 때 보였다가 안보이게된 View는 재사용성을 위해 2번째 인자인 convertView로 넘어온다.
convertView가 null이 아니라면 재사용 가능, 없다면 layoutInflater로 생성해준다.
*/
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View? {
var p1:View? = convertView
// 재사용가능성이 있는 뷰가 null이면 재사용할 수 있는게 없기 때문에 R.layout.row로 만들어주고,
// 만약에 null이 아니고 넘어오면, 다시 만들어올 필요가 없음.
if(p1 == null)
{
p1 = layoutInflater.inflate(R.layout.row, null)
}
//텍스트뷰를 반환하고
var textView:TextView? = p1?.findViewById<TextView>(R.id.textView2)
var button1:Button? = p1?.findViewById<Button>(R.id.button);
var button2:Button? = p1?.findViewById<Button>(R.id.button2);
// 예제에서 n번째 버튼이 눌리면 발생하는 이벤트를 만들고싶은데,
// 안드로이드OS가 이게 몇번째 버튼인지 알 수 있는 방법이 없다.
// 따라서 이 함수에서 ButtonView의 tag 항목에 이 버튼이 리스트뷰의 몇번째 항목인지 전달해준다.
// 버튼 객체 안에다가 tag 항목을 넣어놨기 때문에
// 리스너의 OnClick()에서 넘어가는 ButtonView에 tag값으로 보내준다.
button1?.tag = position
button2?.tag = position
button1?.setOnClickListener(listner);
button2?.setOnClickListener(listner);
// 항목의 인덱스 번호를 텍스트에 넣고
textView?.text = data[position]
//항목을 반환
return p1
}
}
'Deperecated > Android_강의' 카테고리의 다른 글
안드로이드 - ViewPager (1) | 2020.02.12 |
---|---|
안드로이드 - Spinner (0) | 2020.02.12 |
안드로이드 - CustomListView2 (0) | 2020.02.10 |
안드로이드 - CustomListView (0) | 2020.02.10 |
안드로이드 - ListView (0) | 2020.02.10 |