Deperecated/Android_강의

안드로이드 - CustomAdapter

누알라리 2020. 2. 12. 21:47
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