스피너 db에서 값 받아오기

소정·2024년 2월 15일
0

Kotlin

목록 보기
25/27

1. 스피너용 vo data 클래스 만들기

코드를 입력하세요

2. 레트로핏2를 활용하여 db에서 값 불러오기

2-1) call 객체로 리턴 받는 service 만들기 스피너에 여러값을 보여줘야하기 때문에 List<Combo'>로 받는다.

@FormUrlEncoded
    @POST("_.php") //서버 주소
    fun comboMenu(@Field("module_io") moduleIo : String, @Field("state_yn") stateYn : String) : Call<List<Combo>> //성공

2-2) MainActivity에서 위에서 만든 service를 활용해 값을 불러온다

private fun getCombobox(moduleIo: String, stateYn: String) {
        RetrofitBaseUrl.getRetrofitInstance(Common.dbUrl)
            .create(RetrofitService::class.java).comboMenu(moduleIo, stateYn)
            .enqueue(object : Callback<List<Combo>> {
                override fun onResponse(call: Call<List<Combo>>, response: Response<List<Combo>>) {
                    val combo: List<Combo>? = response.body()

                    if (combo != null) {
                        Log.d("TAG", "combo => ${combo.size}")
                        setComboUi(combo)
                    }
                }

                override fun onFailure(call: Call<List<Combo>>, t: Throwable) {
                    Toast.makeText(this@MainActivity, "서버에 문제가 있습니다.", Toast.LENGTH_SHORT).show()
                    Log.i("TAG", "selectInfo 문제 : ${t.message}")
                }
            })
    }

3. runOnUiThread를 사용해서 메인 스레드에게 ui 그리기 요청

3-1) 받아온 값 중 스피너에 텍스트로 뿌려줄 컬럼을 ArrayList에 제네릭 string으로 담는다.

3-2) ArrayAdapter를 이용하여 ui를 그린다
매개변수로 (context, 스피너 텍스트용 UI, 스피너 텍스트용 UI에 텍스트뷰 id, 3-1에서 담은 array) 를 보낸다

3-3) 스피너 셀렉트 리스너 달아주고 원하는 기능 넣어주기

스피너 텍스트용 UI

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_sp_item"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:lineSpacingExtra="6sp"
        android:paddingHorizontal="20dp"
        android:paddingVertical="16dp"
        android:textSize="16sp"
        android:textStyle="normal"/>

</LinearLayout>

스피너 UI 그리는 코드

private fun setComboUi(combo: List<Combo>) {
        runOnUiThread {
            
            //3-1)
            val comboArr : ArrayList<String> = ArrayList()

            for(i in combo.indices) {
                comboArr.add(combo.get(i).comboMenu)
            }

			//3-2)
            val adapter : ArrayAdapter<String> = ArrayAdapter(this, R.layout.spinner_item, R.id.tv_sp_item , comboArr)

            binding.spinner.adapter = adapter

			// 3-3) 
            binding.spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                override fun onItemSelected(
                    parent: AdapterView<*>,
                    view: View,
                    position: Int,
                    id: Long
                ) {
                    // 선택된 항목 처리
                    val selectedCombo = combo[position]
                    // WebView에 해당 URL을 표시
                    val webViewUrl = "http://${selectedCombo.domain}${selectedCombo.path}${selectedCombo.phpFile}"
                    binding.webView.loadUrl(webViewUrl)

                }
                override fun onNothingSelected(parent: AdapterView<*>?) {
                    // 선택된 항목이 없는 경우 처리
                }
            }

        }
    }
profile
보조기억장치

0개의 댓글