簡體   English   中英

Kotlin:微調器不會顯示

[英]Kotlin: Spinner won't show

我正在將我的應用程序遷移到 Kotlin,並且以前運行良好的微調器(在 Java 中)停止在 Kotlin 中工作。

這是我的 CustomShareSpinnerAdapter 類:

class CustomShareSpinnerAdapter(
    applicationContext: Context?,
    private val shareOptions: Array<String>
) : BaseAdapter() {
    private val inflter: LayoutInflater
    override fun getCount(): Int {
        return shareOptions.size
    }

    override fun getItem(i: Int): Any? {
        return null
    }

    override fun getItemId(i: Int): Long {
        return 0
    }

    @SuppressLint("InflateParams")
    override fun getDropDownView(position: Int, _convertView: View?, parent: ViewGroup): View {
        var convertView = _convertView
        if (convertView == null) {
            val vi =
                parent.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
            convertView = vi.inflate(R.layout.share_spinner_row, null)
        }
        val llLayout = super.getDropDownView(position, convertView, parent)
        if (parent.parent!=null)
            roundCorners(parent)
        return llLayout
    }

    private fun roundCorners(parent: ViewGroup) {
        val container2Round = parent.parent as View
        val gd = GradientDrawable(
            GradientDrawable.Orientation.TOP_BOTTOM, intArrayOf(Color.WHITE, Color.WHITE)
        )
        val radius = AWScreen.dp2px(10)
        gd.cornerRadius = radius.toFloat()
        container2Round.background = gd
    }

    override fun getView(i: Int, _view: View?, viewGroup: ViewGroup): View {

        val view = _view ?:
        inflter.inflate(R.layout.share_spinner_row, viewGroup, false)

        val tvShare = view.findViewById<TextView>(R.id.share)
        tvShare.text = shareOptions[i]
        if (shareOptions[i] == "") tvShare.visibility = View.GONE
        setListItemRoundedCorners(tvShare, i)
        if (i == shareOptions.size - 1) {
            val padding = AWScreen.sp2px(10f, view.context)
            tvShare.setPadding(padding, padding, padding, padding)
        }
        return view
    }

    private fun setListItemRoundedCorners(tvShare: TextView, i: Int) {
        if (i == 1) {
            tvShare.setBackgroundResource(R.drawable.rounded_border_top)
        } else {
            if (i == 2) {
                tvShare.setBackgroundResource(R.drawable.rounded_border_bottom)
            }
        }
    }

    init {
        inflter = LayoutInflater.from(applicationContext)
    }
}

share_spinner_row.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/shareLayout"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
              android:orientation="horizontal">

    <TextView
        android:id="@+id/share"
        android:textSize="20sp"
        android:textColor="#000"
        android:paddingTop="10dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:paddingBottom="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

這是我設置 ShareSpinner 的地方:

private fun setShareSpinner() {
    val shareOptions = arrayOf(
        "",
        getStringResourceByName("displaythoughtactivity_sharespinner_text0"),
        getStringResourceByName("displaythoughtactivity_sharespinner_text1"),
        getStringResourceByName("displaythoughtactivity_sharespinner_text2")
    )
    val customAdapter = CustomShareSpinnerAdapter(this, shareOptions)
    binding!!.shareSpinner.adapter = customAdapter
    binding!!.shareSpinner.onItemSelectedListener = this
}

onItemSelected:

override fun onItemSelected(arg0: AdapterView<*>, arg1: View, position: Int, id: Long) {
    val shareSpinnerId = R.id.shareSpinner
    val saveSpinnerId = R.id.saveSpinner
    when (arg0.id) {
        shareSpinnerId -> {
            onShareSpinnerItemSelected(position)
            binding!!.shareSpinner.setSelection(0)
        }
        saveSpinnerId -> {
            onSaveSpinnerItemSelected(position)
            binding!!.saveSpinner.setSelection(0)
        }
        else -> loadAnimSpinnerItem(position)
    }
}

單擊共享圖標時,微調器不會顯示。

Logcat 上沒有異常、沒有崩潰、沒有錯誤,只是不會顯示。

我很確定它會以愚蠢的方式結束,但無法弄清楚。

編輯1:

另一方面,即使我不是微調器生命周期的專家,我也不明白為什么它在微調器設置期間通過 getView 兩次(而不僅僅是一次),而當我只有我的微調器中有 4 件物品。

好的,這就是我讓它工作的方式:

getDropDownView:

@SuppressLint("InflateParams")
override fun getDropDownView(position: Int, _convertView: View?, parent: ViewGroup): View? {
    val viewHolder = if (_convertView==null) ViewHolder1() else _convertView.tag as ViewHolder1

    var view = _convertView
    if (view==null){
        view = inflater.inflate(R.layout.share_spinner_row, parent, false)
        viewHolder.spinnerRow = view.findViewById(R.id.share)
        view!!.tag = viewHolder
    }

    val llLayout = super.getDropDownView(position, _convertView, parent)

    if (parent.parent!=null)
        roundCorners(parent)

    return llLayout
}

獲取視圖:

override fun getView(i: Int, _view: View?, viewGroup: ViewGroup): View { 
    val viewHolder = if (_view==null) ViewHolder1() else _view.tag as ViewHolder1

    var view = _view
    if (view==null){
        view = inflater.inflate(R.layout.share_spinner_row, viewGroup, false)
        viewHolder.spinnerRow = view.findViewById(R.id.share)
        view!!.tag = viewHolder
    }

    val tvShare = viewHolder.spinnerRow
    tvShare!!.text = shareOptions[i]

    if (shareOptions[i] == "") tvShare.visibility = View.GONE else tvShare.visibility = View.VISIBLE

    setListItemRoundedCorners(tvShare, i)
    if (i == shareOptions.size - 1) {
        val padding = AWScreen.sp2px(10f, view.context)
        tvShare.setPadding(padding, padding, padding, padding)
    }

    return view
}

類 ViewHolder1:

class ViewHolder1 {
    var spinnerRow: TextView? = null
}

現在它顯示正確,並按預期顯示圓角。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM