20230822 TIL ListView 사용법

이성진·2023년 8월 22일
1

TIL

목록 보기
19/95
post-custom-banner

1. 엑티비티 화면 xml 에 리스트 뷰 배치 + id값 부여.

xml프리뷰에서는 목록이 나타나지만 , 실제로 실행하면 아무것도 안나오는게 정상.
리스트뷰는 Adapter의 도움을 받아 내용목록을 출력. (아직 어댑터 작업X)

2.리스트뷰가 뿌려줄 데이터들을 표현하는 데이터 클래스 작업. (없으면 새로 만들자)

  • 데이터클래스들은 별도로 datas패키지에 관리 (없다면 새로 생성)
  • kotlin File / class 로 데이터 클래스 생성 -> 이름 대문자로 시작하도록
  • 클래스의 생성자에서 val 변수이름; 자료형을 나열해서,클래스가 가져야 하는 정보 항목들로 설정
  • 서버가 내려주는 데이터들을 저장하기 위한 멤버변수를 var로 생성

3.데이터가 뿌려질 모양을 xml로 layout 폴더에 추가

  • layout 폴더 우클릭 -> new -> layout resource file 선택
  • 이름짓기 : 그림 파일처럼 영소문자 + "_" + 숫자의 조합으로 짓자.
    => ~~_list_item의 양식으로 지어주는게 일반적.
  • 화면을 그리는것과 같은 요령으로 한 줄에 해당하는 모양을 xml로 작성.

4. Adapter 클래스 생성 -> 데이터클래스 + xml을 조합해서 -> 리스트뷰에 뿌려주는 역할.(기초 뼈대 작업만 우선 진행)

  • 기초 뼈대 작업 (기본 xml 만 화면에 등장)

  • 어댑터들은 adapters 패키지에 따로 관리 (없다면 새로 생성)

  • 어댑터 클래스도 새 kotlin 클래스로 생성
    -> 이름짓기 : ~~Adapter 로 짓자. 어떤 목록을 뿌려주는 어댑터인지 알 수 있도록.

  • 이클래스가 ArrayAdapter를 상속받는다고 명시하자
    ->:ArrayAdapter<뿌려줄데이터클래스>()
    ->ArrayAdapter는 기본생성자 ()을 지원하지않는다. => 에러 발생.

  • 어댑터를 만들때 생성자에게 재료를 받아다 부모에게 넘겨줘야 에러해결

    • 어댑터의 주 생성자에서 필요한 재료를 받자.


      class 어댑터클래스(val mContext: Context, val resId:Int, val mList:List<뿌려줄데이터클래스>

    • 주 생성자에서 받은 재료를 순서대로 부모에게 넘기자.
      => ArrayAdater<데이터클래스>(mContext, resId, mList)

  • xml을 가지고 => 객체로 변환해주는 (화면에 뿌리도록 도와주는) 변수를 멤버변수로 생성.

    val inf = LayoutInflater.from(mContext)

  • getView 함수를 오버라이딩 => 기본 모양 X, 우리가 원하는 모양이 뿌려지게 하려고 오버라이딩.

  • convertView 변수를 => var tempRow에 옮겨담아서 => null 인 경우에는 새로 inflate 해서 담자.

var tempRow = convertView
if (tempRow == null) {
tempRow = inf.inflate(R.layout.한줄xml, null)
}

  • 진짜 row를 만들어서, tempRow가 절대 null이 아니다 라고 하면서 대입.
    => val row = tempRow!!
  • 최종적으로 리스트뷰에 이 row를 뿌려달라고 리턴처리.
    => return row

5. 액티비티에서 실제 목록을 담아줄 ArrayList를 만들고, 그 안에 실제 데이터들을 담아주자.

  • 액티비티의 "멤버변수"로 ArrayList 생성.

    val 목록변수이름 = ArrayList<뿌려줄데이터클래스>()

  • 실제 뿌려줄 데이터들을 ArrayList변수에 추가해주자.
    1)직접 코드에 타이핑 해서 연습용 데이터를 추가
    2) 서버에서 내려주는 목록 데이터를 받아서 ArrayList에 담아준다.

6. 만들어둔 (정의해둔) Adapter 클래스를 액티비티에 있는 리스트뷰와 연결

  • 멤버변수로 생성해둘때, 초기화를 나중에 한다고 해두자.
    => lateinit var 어댑터변수 : 어댑터클래스이름
  • adapter클래스를 객체화 (5.에서 만든 목록과 연결) => onCreate 내부에서.
    => 어댑터변수 = 어댑터클래스(this, R.layout.~_list_item, 목록변수이름)
  • 객체화 된 adapter변수를 => 리스트뷰의 어댑터로 지정
    => 리스트뷰변수.adapter = 어댑터변수
    ※ 여기까지 작업해야 일단 리스트뷰에 뭔가 나타나기 시작한다. => 실제 데이 터들은 반영되지 않은 상태.

7. 실제 데이터가 목록에 반영되도록, Adapter 클래스의 getView 함수 내부 수정.

  • row변수의 내용물을 코틀린단에서 변경해주자.
  • row변수 내부의 UI들을 id를 붙여서 코틀린으로 가져오자.
    => ex. val nameTxt = row.findViewById(R.id.nameTxt)
  • (최초 1회만 코딩) mList 내부에서, position 에 맞는 데이터 가져오기.
    => ex. val data = mList[position]
  • data 내부의 값 / 함수 등을 활용해서 => 표시할 자리에 반영 (알고리즘 고민)
profile
2023.08 ~ Android Kotlin 공부
post-custom-banner

4개의 댓글

comment-user-thumbnail
2023년 8월 22일

어댑터 뷰 부터 너무너무 어렵습니다...ㅠㅠ!! 이번 3주간 도 화이팅 합시다..!!

답글 달기
comment-user-thumbnail
2023년 8월 22일

오 til은 이렇게 쓰는거군여...!! 배워갑니당 ! 3주 화이팅 해요 반가워용 성진님 !!

답글 달기
comment-user-thumbnail
2023년 8월 22일

오늘 공부한 내용을 잘 정리하신 것으로 보입니다.
앞으로 3주 간 잘 부탁드립니다.!!!!

답글 달기
comment-user-thumbnail
2023년 8월 22일

진도 금방 나가셨군요 ㅜㅜ 앞으로의 고난이 예상됩니다.. 동안 잘 부탁드려요!

답글 달기