Ver código fonte

优化、测试SelectableInput

Frankensteinly 1 ano atrás
pai
commit
431abd382e

+ 8 - 1
app/src/main/java/com/grkj/iscs/activity/SopActivity.kt

@@ -4,6 +4,8 @@ import com.grkj.iscs.base.BaseMvpActivity
 import com.grkj.iscs.databinding.ActivitySopBinding
 import com.grkj.iscs.iview.ISopView
 import com.grkj.iscs.presenter.SopPresenter
+import com.grkj.iscs.util.ToastUtils
+import com.grkj.iscs.widget.SelectableInput
 
 class SopActivity : BaseMvpActivity<ISopView, SopPresenter, ActivitySopBinding>() {
 
@@ -11,7 +13,12 @@ class SopActivity : BaseMvpActivity<ISopView, SopPresenter, ActivitySopBinding>(
         get() = ActivitySopBinding.inflate(layoutInflater)
 
     override fun initView() {
-
+        mBinding?.siTest?.mOptionList = mutableListOf("1", "2", "3")
+        mBinding?.siTest?.setOnSpinnerSelectListener(object : SelectableInput.OnSpinnerSelectListener {
+            override fun onSelect(str: String?, index: Int) {
+                ToastUtils.tip("$str - $index")
+            }
+        })
     }
 
     override fun initPresenter(): SopPresenter {

+ 51 - 26
app/src/main/java/com/grkj/iscs/widget/SelectableInput.kt

@@ -8,9 +8,10 @@ import android.view.ViewGroup
 import android.widget.LinearLayout
 import android.widget.PopupWindow
 import com.grkj.iscs.R
-import com.grkj.iscs.databinding.ItemBleBinding
 import com.grkj.iscs.databinding.LayoutSelectableInputBinding
-import com.grkj.iscs.util.ToastUtils
+import com.grkj.iscs.databinding.LayoutSelectableinputSpinnerBinding
+import com.zhy.adapter.recyclerview.CommonAdapter
+import com.zhy.adapter.recyclerview.base.ViewHolder
 
 
 class SelectableInput(private val ctx: Context, attrs: AttributeSet) : LinearLayout(ctx, attrs) {
@@ -21,6 +22,11 @@ class SelectableInput(private val ctx: Context, attrs: AttributeSet) : LinearLay
     }
 
     private var mBinding: LayoutSelectableInputBinding
+    private var mDropdownView: View? = null
+    private var mPopWindow: PopupWindow? = null
+    var mOptionList = mutableListOf<String>()
+    private var isSkipListener: Boolean = true
+    private var mSelectListener: OnSpinnerSelectListener? = null
 
     init {
         val root = View.inflate(ctx, R.layout.layout_selectable_input, this)
@@ -42,35 +48,18 @@ class SelectableInput(private val ctx: Context, attrs: AttributeSet) : LinearLay
 
     private fun setMode(mode: Int) {
         if (mode == MODE_SELECT) {
-            mBinding.et.isEnabled = false
-
-            mBinding.et.visibility = View.GONE
-
-            mBinding.tvName.setOnClickListener {
-                val contentView = LayoutInflater.from(ctx).inflate(R.layout.item_ble, null)
-                
-                val popWnd = PopupWindow(context)
-                popWnd.contentView = contentView
-//                popWnd.width = ViewGroup.LayoutParams.MATCH_PARENT
-                popWnd.width = this.width
-                popWnd.height = ViewGroup.LayoutParams.WRAP_CONTENT
-                popWnd.isOutsideTouchable = true
-                popWnd.showAsDropDown(mBinding.tvName)
-
-                val popBinding = ItemBleBinding.bind(contentView)
-                popBinding.bleName.setOnClickListener {
-                    ToastUtils.tip("ble name")
-                    popWnd.dismiss()
+//            mBinding.et.isEnabled = false
+            mBinding.et.inputType = 0
+
+//            btnDropdown.visibility = View.VISIBLE
+            mBinding.et.setOnClickListener {
+                if (mOptionList.isNotEmpty()) {
+                    showDropdown()
                 }
             }
-//            btnDropdown.visibility = View.VISIBLE
-//            if (!options.isNullOrEmpty()) {
-//                btnDropdown.setOnClickListener(onBtnDropdownClickListener)
-//            }
         } else {
             mBinding.et.isEnabled = true
 
-            mBinding.et.visibility = View.VISIBLE
 //            btnDropdown.visibility = View.GONE
 //            btnDropdown.setOnClickListener(null)
 //            clContainer.setOnClickListener {
@@ -80,4 +69,40 @@ class SelectableInput(private val ctx: Context, attrs: AttributeSet) : LinearLay
 //            }
         }
     }
+
+    private fun showDropdown() {
+        mDropdownView?:let {
+            mDropdownView = LayoutInflater.from(ctx).inflate(R.layout.layout_selectableinput_spinner, null)
+        }
+
+        mPopWindow ?: let {
+            mPopWindow = PopupWindow(context)
+            mPopWindow?.contentView = mDropdownView
+            mPopWindow?.width = mBinding.et.width
+            mPopWindow?.height = ViewGroup.LayoutParams.WRAP_CONTENT
+            mPopWindow?.isOutsideTouchable = true
+
+            val popBinding = LayoutSelectableinputSpinnerBinding.bind(mDropdownView!!)
+            popBinding.rvOptions.adapter = object : CommonAdapter<String>(ctx, R.layout.item_rv_selectableinput_spinner, mOptionList) {
+                override fun convert(holder: ViewHolder?, option: String?, position: Int) {
+                    holder?.setText(R.id.tv_option, option)
+                    holder?.setOnClickListener(R.id.tv_option) {
+                        mBinding.et.setText(option)
+                        mSelectListener?.onSelect(option, position)
+                        mPopWindow?.dismiss()
+                    }
+                }
+            }
+        }
+
+        mPopWindow?.showAsDropDown(mBinding.et)
+    }
+
+    fun setOnSpinnerSelectListener(onSpinnerSelectListener: OnSpinnerSelectListener) {
+        mSelectListener = onSpinnerSelectListener
+    }
+
+    interface OnSpinnerSelectListener {
+        fun onSelect(str: String?, index: Int)
+    }
 }

+ 1 - 0
app/src/main/res/layout/activity_sop.xml

@@ -7,6 +7,7 @@
     tools:context=".activity.SopActivity">
 
     <com.grkj.iscs.widget.SelectableInput
+        android:id="@+id/si_test"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_marginRight="100dp"

+ 12 - 0
app/src/main/res/layout/item_rv_selectableinput_spinner.xml

@@ -0,0 +1,12 @@
+<?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="wrap_content"
+    android:layout_margin="@dimen/rv_item_margin"
+    android:orientation="horizontal">
+
+    <TextView
+        android:id="@+id/tv_option"
+        style="@style/CommonTextView"
+        android:layout_width="match_parent" />
+</LinearLayout>

+ 11 - 11
app/src/main/res/layout/layout_selectable_input.xml

@@ -22,16 +22,16 @@
         android:id="@+id/et"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:textColor="@color/black"
-        android:visibility="gone" />
+        android:background="@drawable/selectable_input_spinner_bg"
+        android:textColor="@color/black" />
 
-<!--    <Spinner-->
-<!--        android:id="@+id/spinner"-->
-<!--        android:layout_width="match_parent"-->
-<!--        android:layout_height="wrap_content"-->
-<!--        android:layout_gravity="center_vertical"-->
-<!--        android:background="@drawable/selectable_input_spinner_bg"-->
-<!--        android:minHeight="@dimen/selectable_input_min_height"-->
-<!--        android:spinnerMode="dropdown"-->
-<!--        android:visibility="gone" />-->
+    <!--    <Spinner-->
+    <!--        android:id="@+id/spinner"-->
+    <!--        android:layout_width="match_parent"-->
+    <!--        android:layout_height="wrap_content"-->
+    <!--        android:layout_gravity="center_vertical"-->
+    <!--        android:background="@drawable/selectable_input_spinner_bg"-->
+    <!--        android:minHeight="@dimen/selectable_input_min_height"-->
+    <!--        android:spinnerMode="dropdown"-->
+    <!--        android:visibility="gone" />-->
 </LinearLayout>

+ 10 - 0
app/src/main/res/layout/layout_selectableinput_spinner.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/rv_options"
+        style="@style/CommonRecyclerView"
+        android:layout_height="wrap_content" />
+</RelativeLayout>