From f8ac639515cf38c35bab6304037b9f6b4149784b Mon Sep 17 00:00:00 2001 From: jhg3410 <80373033+jhg3410@users.noreply.github.com> Date: Thu, 12 Jan 2023 20:37:27 +0900 Subject: [PATCH] =?UTF-8?q?frame=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boostcamp/uniletter_spinner/Jikpinner.kt | 68 ++++++++++++++----- .../uniletter_spinner/JikpinnerAdapter.kt | 34 ---------- .../src/main/res/drawable/ic_arrow_down.xml | 5 ++ .../app/src/main/res/layout/activity_main.xml | 16 +---- .../app/src/main/res/layout/jikpinner.xml | 25 ++----- 5 files changed, 65 insertions(+), 83 deletions(-) delete mode 100644 uniletter-spinner/app/src/main/java/org/boostcamp/uniletter_spinner/JikpinnerAdapter.kt create mode 100644 uniletter-spinner/app/src/main/res/drawable/ic_arrow_down.xml diff --git a/uniletter-spinner/app/src/main/java/org/boostcamp/uniletter_spinner/Jikpinner.kt b/uniletter-spinner/app/src/main/java/org/boostcamp/uniletter_spinner/Jikpinner.kt index b63866a..aa3582e 100644 --- a/uniletter-spinner/app/src/main/java/org/boostcamp/uniletter_spinner/Jikpinner.kt +++ b/uniletter-spinner/app/src/main/java/org/boostcamp/uniletter_spinner/Jikpinner.kt @@ -2,30 +2,31 @@ package org.boostcamp.uniletter_spinner import android.content.Context import android.util.AttributeSet -import android.util.Log -import android.view.View +import android.widget.ArrayAdapter +import android.widget.FrameLayout +import android.widget.ListPopupWindow import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout -import androidx.recyclerview.widget.RecyclerView class Jikpinner @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : ConstraintLayout(context, attrs, defStyleAttr) { - private lateinit var items: Array - private lateinit var title: TextView - private lateinit var recyclerView: RecyclerView + private lateinit var items: Array + private val popUp = ListPopupWindow(context) init { + inflate(context, R.layout.jikpinner, this@Jikpinner) + + setAttrs(attrs) + setAdapter() setView() - setVisibility() - - recyclerView.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom -> - title.width = right - left - } + setPopup() + popUp.setContentWidth(measureWidth() + 100) + findViewById(R.id.tv_title).width = popUp.width } private fun setAttrs(attrs: AttributeSet?) { @@ -35,19 +36,50 @@ class Jikpinner @JvmOverloads constructor( } } - private fun setView() { - inflate(context, R.layout.jikpinner, this@Jikpinner) - recyclerView = findViewById(R.id.rv_menu).apply { - adapter = JikpinnerAdapter(items) + + private fun setAdapter() { + popUp.setAdapter(ArrayAdapter(context, R.layout.item_jikpinner, items)) + } + + private fun measureWidth(): Int { + var width = 0 + for (i in items.indices) { + val view = ArrayAdapter(context, R.layout.item_jikpinner, items).getView( + i, + null, + FrameLayout(context) + ) + view.measure(0, 0) + width = width.coerceAtLeast(view.measuredWidth) } - title = findViewById(R.id.title).apply { + return width + } + + private fun setView() { + findViewById(R.id.tv_title).apply { text = items.first() + setOnClickListener { + if (popUp.isShowing) { + popUp.dismiss() + } else { + popUp.show() + } + } } } - private fun setVisibility() { - title.setOnClickListener { + private fun setPopup() { + + popUp.isModal = true + popUp.anchorView = this + popUp.verticalOffset = this.height + 8 + setOnItemClickListener() + } + private fun setOnItemClickListener() { + popUp.setOnItemClickListener { _, _, position, _ -> + findViewById(R.id.tv_title).text = items[position] + popUp.dismiss() } } } \ No newline at end of file diff --git a/uniletter-spinner/app/src/main/java/org/boostcamp/uniletter_spinner/JikpinnerAdapter.kt b/uniletter-spinner/app/src/main/java/org/boostcamp/uniletter_spinner/JikpinnerAdapter.kt deleted file mode 100644 index a171c55..0000000 --- a/uniletter-spinner/app/src/main/java/org/boostcamp/uniletter_spinner/JikpinnerAdapter.kt +++ /dev/null @@ -1,34 +0,0 @@ -package org.boostcamp.uniletter_spinner - -import android.util.Log -import android.view.View -import android.view.ViewGroup -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView - -class JikpinnerAdapter(private val items: Array) : - RecyclerView.Adapter() { - - class ViewHolder(private val view: View) : RecyclerView.ViewHolder(view) { - - fun bind(text: String) { - view.findViewById(R.id.item).run { - this.text = text - setOnClickListener { - Log.d("Jikpinner", "$text clicked") - } - } - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): JikpinnerAdapter.ViewHolder { - val view = View.inflate(parent.context, R.layout.item_jikpinner, null) - return ViewHolder(view) - } - - override fun onBindViewHolder(holder: JikpinnerAdapter.ViewHolder, position: Int) { - holder.bind(items[position].toString()) - } - - override fun getItemCount() = items.size -} diff --git a/uniletter-spinner/app/src/main/res/drawable/ic_arrow_down.xml b/uniletter-spinner/app/src/main/res/drawable/ic_arrow_down.xml new file mode 100644 index 0000000..9e345b8 --- /dev/null +++ b/uniletter-spinner/app/src/main/res/drawable/ic_arrow_down.xml @@ -0,0 +1,5 @@ + + + diff --git a/uniletter-spinner/app/src/main/res/layout/activity_main.xml b/uniletter-spinner/app/src/main/res/layout/activity_main.xml index 6dd6ac4..787927b 100644 --- a/uniletter-spinner/app/src/main/res/layout/activity_main.xml +++ b/uniletter-spinner/app/src/main/res/layout/activity_main.xml @@ -4,8 +4,9 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/teal_200" - tools:context=".MainActivity"> + android:background="@color/teal_200"> + + - - - - - - \ No newline at end of file diff --git a/uniletter-spinner/app/src/main/res/layout/jikpinner.xml b/uniletter-spinner/app/src/main/res/layout/jikpinner.xml index 1263406..0abec08 100644 --- a/uniletter-spinner/app/src/main/res/layout/jikpinner.xml +++ b/uniletter-spinner/app/src/main/res/layout/jikpinner.xml @@ -2,35 +2,24 @@ + android:layout_width="match_parent" + android:layout_height="match_parent"> - - \ No newline at end of file