[英]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.