[Kotlin] 리스트뷰 (List View)

SeonDal·2021년 7월 6일
1

공부한 강의
www.youtube.com/watch?v=ao0Iqfhy0oo&list=PLC51MBz7PMywN2GJ53aF0UO5fnHGjW35a&index=5


1. 간단하지만 제약이 있는 1번방법 (알아만두자)

배열내용은,, 최근 본 웹툰인물들 이름..

override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sub)
        
        val item = arrayOf("정황지","위성연","미은","김사능")
        //context : 한 엑티비티의 모든 정보를 담고있음.
        
        listView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, item)
        
     }

2. 쓸만하지만 복잡한 2번방법

1) ListView 만들기

: 리스트뷰를 xml 파일에 만든다


2) 모델객체 만들기

: 코틀린파일(.kt) 생성

//클래스 모델 객체

class Content (val 변수1: Int, val 변수2: String)
  • 변수는 당연히 많아도 됨
  • 여기서는 Content 라는 이름의 코틀린 파일을 만들고 클래스 이름도 Content로 해놨다.

3) 리스트 항목 꾸미기

  • 레이아웃 에 리소스파일(.xml) 생성
  • 다른 리소스파일 꾸미듯이 꾸미면 된다.

리스트 항목 크기 조정
ConstraintLayout 클릭 - Layout - Layout_width, Layout_height 항목 조정


4) Adapter 만들기

  • 코드를 연결하는 개념이라고 생각하자

  • 리스트뷰는 어뎁터 연결을 꼭해야하고 아래 함수들을 호출한다 (계속)!


: 코틀린파일(.kt) 생성

class ContentAdapter (val context: Context, val ContentList : ArrayList<Content/*모델명*/>) : BaseAdapter() {

}

ContentAdapter 은 어뎁터의 이름

ContentList 는 배열이름

<>안의 Content 는 모델이름


** 중요 : 이때 나오는 오류에 대해 안드로이드 스튜디오가 제안하는 모든 해결책을 수행하면 (option + enter) 아래의 코드가 자동으로 클래스 안에 만들어진다.

override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
    }

override fun getItem(position: Int): Any {
    }

override fun getItemId(position: Int): Long {
    }

override fun getCount(): Int {
    }

4-1. getView 함수 안에 쓸 코드

4-1-1. 변수가 텍스트뿐이라면

 override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        // getView : "position" (인덱스처럼 0부터시작) 값을 가지고 있는 변수들을 만든다.

        val view: View = LayoutInflater.from(context).inflate(R.layout.리스트이름, null)
        // 리소스.레이아웃."xml파일"로부터 뷰를 붙이는 과정
        // R.layout.리스트이름 : 리소스폴더(res) - 레이아웃폴더(layout) - "리스트이름"이라는 이름의 리스트

        val 변수1 = view.findViewById<TextView>(R.id."텍스트뷰아이디")
        val 변수2 = view.findViewById<TextView>(R.id."텍스트뷰아이디")
        // "변수" 는 "뷰아이디" 로부터 뷰를 찾아라
        // <>안에는 형태 ex.TextView, ImageView...
      
        val content = ContentList[position]
        // val 변수이름 = 배열이름[position]
        // 배열의 'position+1' 번째 항목
 
        변수1.text = content.변수1
        변수2.text = content.변수2
        //변수.text 는 content모델에서 끌어오는 변수

        return view
    }

4-1-2. 변수에 이미지 포함한다면 다음 코드 사용

val 변수 = view.findViewById<ImageView>(R.id."이미지뷰아이디")

이미지.setImageResource(content.이미지)

4-2. 나머지 함수

 override fun getItem(position: Int): Any {
        return ContentList[position]
    }
 override fun getItemId(position: Int): Long {
        return 0
    }
    override fun getCount(): Int {
        return ContentList.size
    }

5. Adapter 를 Activity 에 연결하기

5-1. 리스트 선언

: 뷰리스트가 포함된 .xml 에 포함된 코틀린파일(.kt)에 다음과 같은 코드 작성

//리스트 만들기

var ContentList = arrayListOf<모델클래스이름>(
        모델클래스이름 (R.drawable.이미지, "위성연", "불"),	//콤마 빼먹지말기
        모델클래스이름(R.drawable.이미지, "미은", "납"),	//변수 순서 맞추기 주의
        모델클래스이름(R.drawable.이미지, "정황지", "다재다능")	//콤마 안붙임 주의
       )

여기서 command + click 으로 모델클래스이름 클릭하면 모델클래스로 넘어간다 -> 잘연결됨

5-2. 리스트 활용

: override fun onCreate 함수 안에서 활용 !

 val Adapter = 어뎁터클래스이름(this, ContentList)	
  //여기서 어뎁터쪽으로 쏘면 어뎁터 클래스에서 val ContentList 쪽으로 받아서 등록되는 원리

 listView.adapter = Adapter
 //어뎁터 실행
        

6. 각 리스트 클릭했을 때 특정 일 하도록 만들기

여기서는 토스트팝업뜨는 것만 구현함

리스트뷰이름.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
//특정 리스트 클릭 시 실행

            val selection = parent.getItemAtPosition(position) as Content
            //클릭한 포지션을 가진 변수가 만들어짐
            
            Toast.makeText(this, "${selection.변수1}", Toast.LENGTH_SHORT).show()
            //토스트 팝업으로 클릭한 리스트의 변수값이 뿅하고 나옴
            
        }
profile
김선달 개발블로그

0개의 댓글