[안드로이드] 리스트 뷰(ListView) 사용하기

반응형

아이폰과 마찬가지로 모바일 환경에서 가장 많이 사용되는 형태의 UI가 리스트입니다. 안드로이드 리스트 뷰는 안드로이드에서 가장 많이 사용되는 컴포넌트 중에 하나로 다음과 같은 특징을 가지고 있습니다.

  • 레이아웃과 같은 뷰 그룹에 속함
  • 어뎁터(Adapter)를 통해 데이터와 리스트 뷰를 연결
  • 오래전부터 사용 가능 했으며 API Level 1 부터 존재
  • 프래그먼트를 사용할 경우 this 컨텍스트를 사용할 수 없기 때문에 getActivity() 함수를 사용
  • 프래그먼트를 사용할 경우 LayoutInflater를 사용해 뷰를 가져옴

 

리스트 뷰 생성

아이디가 listview1 인 리스트 뷰를 선언한다.


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listview1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

 

데이터 정의

다음과 같이 데이터를 정의한다.


class MainActivity : AppCompatActivity() {  

    val LIST_MENU = arrayOf("LIST1", "LIST2", "LIST3")

    ...
}

 

 

어뎁터 연결

ArrayAdapter를 만들고 simple_list_item1을 선언한 뒤 기존에 만든 LIST_MENU 데이터를 연결하고 listview에 어뎁터를 연결한다.


val arrayAdapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, LIST_MENU)

val listview = findViewById<ListView>(R.id.listview1)
listview.adapter = arrayAdapter

미리 정의 된 xml 파일 설명
simple_list_item_1 텍스트 뷰 하나로 구성된 레이아웃
simple_list_item_2 텍스트 뷰 두개로 구성된 레이아웃
simple_list_item_checked 오른쪽에 체크 표시가 됨
simple_list_item_single_choice 오른쪽에 라디오 버튼이 나옴
simple_list_item_multiple_choice 오른쪽에 체크버튼이 나옴

 

 

아이템 선택

아이템을 선택하고 해당 데이터를 출력한다.


listview.onItemClickListener = object : AdapterView.OnItemClickListener {
    override fun onItemClick(
        parent: AdapterView<*>?,
        view: View?,
        position: Int,
        id: Long
    ) {
        val strText = parent?.getItemAtPosition(position) as String
        Log.d("프린트 로그", strText)
    }
}

 

 

프래그먼트 뷰에서 리스트 뷰 사용하기

프래그먼트(Fragment)에서 뷰를 사용하려면 다음과 같이 onCreateView에서 fragment 화면을 반환하기 전에 어뎁터와 뷰를 연결해줘야 한다.


class AFragment: Fragment() {

    val LIST_MENU = arrayOf("LIST1", "LIST2", "LIST3")

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val fragmentView = inflater.inflate(R.layout.fragment_a, container, false)

        val adapter =
            activity?.let { ArrayAdapter(it, android.R.layout.simple_list_item_1, LIST_MENU) }

        val listView = fragmentView.findViewById<ListView>(R.id.listview1)
        listView.adapter = adapter

        return fragmentView
    }
}

반응형

댓글

Designed by JB FACTORY