본문 바로가기
안드로이드

spinner

by Beijing_KingGod 2020. 4. 1.

list에서 하나의 항목을 선택하는 spinner = combobox

 

spinneradapter -> 데이터관리함.

-> 데이터의 전체 목록 중에서 화면에 표시할 목록의 view를 spinner에 제공해주는 역할을 한다.

이는 모바일환경에서 전체데이터를 모두 spinner에 직접 할당할 경우  메모리 사용량과 속도에 문제가 생기기 때문

하지만 spinner adapter에는 실제 데이터를 제공하는 부분이 직접 제공되어 있지 않다.

 

 

 

Context -> view에서 시스템의 기능을 호출하기 위한 클래스

 

 

package com.example.exam2

import android.graphics.Color
import android.graphics.Typeface.BOLD
import android.graphics.Typeface.ITALIC
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.CompoundButton
import android.widget.RadioGroup
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    var nameArray = arrayOf("유아","루다", "케이")
    var adapter : ArrayAdapter<String>?  = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        adapter  = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, nameArray)
        nameOption.adapter = adapter
        nameOption.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            override fun onItemSelected( // 항목이 선택되었을 때 동작
                parent: AdapterView<*>?,
                view: View?,
                position: Int,
                id: Long
            ) {
                greetText.setText("${nameArray[position]}님 환영합니다")
            }

            override fun onNothingSelected(parent: AdapterView<*>?) { // 아무 항목이 선택 되지 않을때 동작

            }

        }
    }
}

 

 

 

 

model class ->연관된 데이터들은 하나의 클래스에 묶어 사용하는 개념

package com.example.exam2

import android.graphics.Color
import android.graphics.Typeface.BOLD
import android.graphics.Typeface.ITALIC
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.CompoundButton
import android.widget.RadioGroup
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    var ProductArray = arrayOf(ProductModel("김치찌개",7000),
        ProductModel("b",8000),
        ProductModel("F",10000)
    )
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var adapter  = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, ProductArray)
        nameOption.adapter = adapter
        nameOption.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            override fun onItemSelected( // 항목이 선택되었을 때 동작
                parent: AdapterView<*>?,
                view: View?,
                position: Int,
                id: Long
            ) {
                with(ProductArray[position]){
                    greetText.text ="${name}의 가격은 ${price}입니다."
                } // 한번의 배열참조로 이름과 가격을 쉽게 표시할수있다.
            }

            override fun onNothingSelected(parent: AdapterView<*>?) { // 아무 항목이 선택 되지 않을때 동작

            }

        }
    }
}

 

스코프 함수!

함수형 언어의 특징을 좀더 편리하게 사용할 수 있도록 기본 제공하는 함수들이다.

클래스의 인스턴스를 스코프함수에 전달하면 인스턴스의 속성이나 함수를 좀 더 깔끔하게 불러서 사용할 수 있다.

메인함수와 별도의 scope에서 인스턴스의 변수와 함수를 조작하므로 코드가 깔끔해진다는 장점이 있다.

 

 ex) apply run with also let

apply : 인스턴스를 생성한 후 변수에 담기 전에 초기화과정을 수행할때 많이 씀

인스턴스를 생성하자 마자 변수나 함수를 실행시킬수 있고, apply는 수행후 인스턴스를 반환 함으로써 바로 변수에 할당해줄수있따.

fun main(){
    var book = Book("디모의 코틀린",10000).apply{
        name = "[초특가]"+name
        discount()
    }
}

class Book(var name:String, var price: Int){
    fun discount(){
        price -=2000
    }
}

run : run 스코프 안에서 참조연산자를 사용하지 않아도 된다는 점은 apply 랑 같지만, 일반 람다함수처럼 인스턴스 대신 마지막 구문의 결과값을 반환 한다

 

 fun main(){
    var book = Book("book1",10000).apply{
        name = "[sale]"+name
        discount()
    }
    
    var t = book.run{
        println("name:${name}, price:${price}won")
     	price   
    }
    println()
    println(t)
}

class Book(var name:String, var price: Int){
    fun discount(){
        price -=2000
    }
}

 

 

with :  run 과 동일한 기능을 가지지만 단지 인스턴스를 참조연산자 대신 패러미터로 받는다는 차이이다.

 

also/let:

also -> 처리가 끝나면 인스턴스 반환

let -> 처리가 끝나면 최종값 반환

 

마치 패러미터로 인스턴스를 넘긴것처럼 it을 통해서 인스턴스를 사용할수 있다.

 

패러미터로 인스턴스를 넘겨 받는 이유, -> 같은 이름의 변수나 함수가 scope 바깥에 중복되어 있는 경우에 혼란을 방지하기 위해서 이다.

apply -> also 대체

run -> let 대체

fun main(){
     var price = 5000
    var book = Book("book1",10000).apply{
        name = "[sale]"+name
        discount()
    }
    
    var t = book.run{
        println("name:${name}, price:${price}won")
     	price   
    }
    println()
    println(t)
    
    book.let{
        println("name:${it.name}, price:${it.price}won")
    }
    
}

class Book(var name:String, var price: Int){
    fun discount(){
        price -=2000
    }
}

name:[sale]book1, price:5000won

 

5000

name:[sale]book1, price:8000won

 

 

 

spinner 의 목록을 동적으로 변경하는법

mutableListOf 를 사용한다. -> list의 내용을 바꾸더라도 adapter가 즉시 화면을 갱신해주지는 않기 때문에 adapter.notifyDataSetChanged() -> 데이터가 변경되었을을 직접 알려주는 함수를 실행해야한다.

 

package com.example.exam2

import android.graphics.Color
import android.graphics.Typeface.BOLD
import android.graphics.Typeface.ITALIC
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.CompoundButton
import android.widget.RadioGroup
import kotlinx.android.synthetic.main.activity_main.*
import kotlin.random.Random
import kotlin.random.nextInt

class MainActivity : AppCompatActivity() {
    var numberlist = mutableListOf<Int>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var adapter  = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, numberlist)
        nameOption.adapter = adapter
        nameOption.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            override fun onItemSelected( // 항목이 선택되었을 때 동작
                parent: AdapterView<*>?,
                view: View?,
                position: Int,
                id: Long
            ) {
                greetText.text="${numberlist[position]}번을 선택하셨습니다."
            }

            override fun onNothingSelected(parent: AdapterView<*>?) { // 아무 항목이 선택 되지 않을때 동작

            }

        }
        addButton.setOnClickListener(object : View.OnClickListener{
            override fun onClick(v: View?) {
                numberlist.add(Random.nextInt(0..100))
                adapter.notifyDataSetChanged()
            }
        })
        removeButton.setOnClickListener(object: View.OnClickListener{
            override fun onClick(v: View?) {
                if(numberlist.isNotEmpty()){
                    numberlist.removeAt(0)
                    adapter.notifyDataSetChanged()
                }
            }

        })
    }
}

'안드로이드' 카테고리의 다른 글

checkbox 와 radiobutton  (0) 2020.04.01
image view  (0) 2020.04.01
view의 속성을 바꾸고 이벤트 처리를 해보자  (0) 2020.03.31
layout  (0) 2020.03.31
view  (0) 2020.03.31

댓글