Android

[안드로이드/AdapterView] AdapterView의 개념과 ListView, GridView

gangmini 2022. 9. 13. 23:03
반응형

💡 AdapterView

  • 버튼이나 텍스트뷰 같이 그 자체로 사용이 가능한 뷰가 아닌 개발자가 view 를 구성하는 데이터를 정해줘야 구현이 가능
  • 해당 데이터 정보를 Adapter Class 에 담아 사용
  • 어댑터 클래스 객체 (데이터와 데이터를 어떻게 보여줄지 xml 을 담음) & 어댑터 뷰 (어댑터 객체를 셋팅 해줌)

 

Adapter Class

  • 어댑터뷰에 달아줄 어댑터 객체를 생성
  • 어떤 데이터를 보여줄 것인지 / 어떻게 데이터를 보여줄 것인지 등의 정보를 파라미터로 설정

    - 첫번째 파라미터 : context

    - 두번째 파라미터 : item 을 어떻게 보여줄지 구성한 layout id

    - 세번째 파라미터 : 보여줄 데이터

        val adapter1 = ArrayAdapter(this, android.R.layout.simple_list_item_1, data1)
        mainBinding.listview1.adapter = adapter1 //어댑터뷰(리스트뷰)에 어댑터 세팅

 

ListView

  • 데이터를 list 방식으로 연속적으로 보여줄 수 있는 adapterview 의 한 종류
  • 메모리 사용에 효율적이지만 구현이 까다로운 Recyclerview 비해 구현이 간단해 간단한 아직도 많이 사용

ListView 주요 이벤트

  • OnitemClickListener : listview의 항목을 터치했을 때 리스너 메소드를 상속 받아 구현
    • onItemClick메소드를 반드시 오버라이딩                                
class MainActivity : AppCompatActivity() {

    lateinit val mainBinding : MainActivityBinding;

    val data1 = arrayof("문자열1","문자열2","문자열3","문자열4","문자열5") //리스트뷰에 넣을 데이터
    
    override fun onCreate(savedInstanceState : Bundle?) {
    	super.onCreate(savedInstanceState)
        mainBinding = ActivityMainBinding.inflate(layoutInflater);
        setContentView(mainBinding.root)
        
        // 어댑터 객체 생성
        val adapter1 = ArrayAdapter(this, android.R.layout.simple_list_item_1, data1) // ArrayAdapter라는 Adapter 클래스
        mainBinding.listview1.adapter = adapter1 //어댑터 셋팅
        
        // 리스트뷰 item 클릭 리스너 설정
        mainBinding.listview1.setOnitemClickListener(ListitemClickListener1()) // 상속 받아 만든 클래스로 객체 만들어 사용
        
        /*
        // 익명클래스로 구현함과 동시에 리스너에 달아 사용
        mainBinding.listview1.setOnitemClickListener(object : AdapterView.OnitemClickListener{
        	override fun onitemClick(parent:Adapter<*>?, view:View?, position:Int, id:Long){
            		when(parent?.id){
            			R.id.list1 -> { // 아이템 클릭시 수행할 동작 }
            		}
               	}})
        */
        
        /*
        // 익명클래스로 구현하고 객체를 생성해 그 객체를 리스너에 달아 사용
        mainBinding.listview1.setOnitemClickListener(listener1)
        
        val listener1 = object : AdapterView.OnitemClickListener{
        	override fun onitemClick(parent:Adapter<*>?, view:View?, position:Int, id:Long){
            		when(parent?.id){
            			R.id.list1 -> { // 아이템 클릭시 수행할 동작 }
                    	}
            	}
        }
        */
        
      }
        
        // AdapterView의 OnitemClickListener를 상속받아 inner 클래스를 만들어 사용
        inner class ListitemClickListener1 : AdapterView.OnitemClickListener{
        	override fun onitemClick(parent:Adapter<*>?, view:View?, position:Int, id:Long) {
        
        	// 첫번째 : 이벤트가 발생한 항목을 가지고 있는 adapterview
        	// 두번째 : 이벤트가 발생한 항목 view
        	// 세번째 : 이벤트가 발생한 항목의 index
        		when(parent?.id){
            			R.id.list1 -> { // 아이템 클릭시 수행할 동작 }
            		}
       	 	}
         }
        
  
}

 

GridView

  • Grid 형태의 ListView 와 거의 동일한 기능 + 추가된 기능을 갖음 

GridView 주요 속성

  • numColumns : 그리드로 구성할 칸의 개수, auto_fit 으로 설정시 디바이스에 맞게 자동 구성

GridView 주요 이벤트

  • onItemClick : 그리드뷰의 항목을 선택했을 때 동작/기능
binding.grid1.setOnItemClickListener(listener1)
} //onCreate() 끝

val listener1 = object : AdapterView.OnItemClickListener{
        override fun onItemClick(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
            when (p0?.id) {
                R.id.grid1 -> {
                    binding.textView.text = "${data1[p2]} 항목을 클릭"
                }
            }
        }
    }
// 리스너를 상속받아 오버라이딩할 메소드가 하나밖에 없을 경우 고차함수로 작성 가능
binding.grid1.setOnItemClickListener { adapterView, view, i, l ->
	binding.textView.text = "${data1[i]} 항목을 클릭"
}

 

반응형