kotlin - 如何从 Kotlin 的 ListView 中获取所选项目?

标签 kotlin android-studio-3.0

代码示例:

package tech.kapoor.listviewdemo

import android.content.Context
import android.graphics.Color
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ListView
import android.widget.TextView
import android.widget.AdapterView


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val listView = findViewById<ListView>(R.id.main_listview)
        var redColor = Color.parseColor("#FF0000")

        listView.setBackgroundColor(redColor)
        listView.adapter = CustomAdapter(this)
    }

    private class CustomAdapter(context: Context): BaseAdapter() {

        private val mContext: Context

        init {
            mContext = context
        }

        override fun getCount(): Int {
            return 80
        }

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }

        override fun getItem(position: Int): Any {
            return position
        }

        override fun getView(position: Int, view: View?, viewGroup: ViewGroup?): View {
            val textView = TextView(mContext)
            textView.text = "Here comes the !!"
            return textView
        }
    }
}

我试图了解 ListView 而不是回收器 View ,以首先了解基础知识。 任何人都知道我们如何在选择或点击时获取选定的行 ID/索引值,以及如何在 kotlin 中对特定行的选择执行一些操作?

最佳答案

要填充 ListView ,您必须拥有数据集。数据集可以是字符串等数据类型的任何列表,也可以使用模型类列表。像这样的:

这是我将在 ListView 中使用的简单数据集列表:

val data = ArrayList<TopicDTO>()
data.add(TopicDTO("1", "Info 1", true))
data.add(TopicDTO("2", "Info 2", false))
data.add(TopicDTO("3", "Info 3", true))
data.add(TopicDTO("4", "Info 4", false))

我创建了一个名为 TopicDTO 的模型类,其中包含 id、title 及其状态。

现在让我们将其填充到 ListView 中:

 list.adapter = ButtonListAdapter(baseContext, data)

这是一个简单的适配器:

class ButtonListAdapter(//Class for rendering each ListItem

        private val context: Context, private val rowItems: List<TopicDTO>) : BaseAdapter() {

    override fun getCount(): Int {
        return rowItems.size
    }

    override fun getItem(position: Int): Any {
        return rowItems[position]
    }

    override fun getItemId(position: Int): Long {
        return rowItems.indexOf(getItem(position)).toLong()
    }


    private inner class ViewHolder {
        internal var main_text: TextView? = null //Display Name
        internal var subtitle: TextView? = null  //Display Description
        internal var can_view_you_online: Button? = null   //Button to set and display status of CanViewYouOnline flag of the class

    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        var convertView = convertView
        var holder: ViewHolder? = null


        val mInflater = context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE) as LayoutInflater

        holder = ViewHolder()


        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.main_lp_view_item, null)

            holder.main_text = convertView!!.findViewById(R.id.main_lp_text) as TextView
            holder.subtitle = convertView.findViewById(R.id.main_lp_subtitle) as TextView
            holder.can_view_you_online = convertView.findViewById(R.id.can_view_you_online) as Button

            convertView.tag = holder

        } else {
            holder = convertView.tag as ViewHolder
        }

        val rowItem = rowItems[position]

        val main_text: String
        val subtitle: String


        holder.main_text!!.text = rowItem.info
        holder.subtitle!!.text = rowItem.info

        if (rowItem.canViewYouOnline) {
            holder.can_view_you_online!!.setBackgroundColor(context.resources.getColor(R.color.colorPrimary))
        } else {
            holder.can_view_you_online!!.setBackgroundColor(context.resources.getColor(R.color.colorAccent))
        }


        holder.can_view_you_online!!.setOnClickListener(object : View.OnClickListener {
            internal var buttonClickFlag: Boolean = false


            override fun onClick(v: View) {           //The Onclick function allows one to click the button on the list item and set/reset the canViewYouOnline flag. It is working fine.

            }
        })


        return convertView

    }


}

现在您可以像这样获取您选择的项目:

list.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id ->
            // This is your listview's selected item
            val item = parent.getItemAtPosition(position) as TopicDTO
        }

希望您能理解这一点。

关于kotlin - 如何从 Kotlin 的 ListView 中获取所选项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46011223/

相关文章:

kotlin - Kotlin 的不稳定属性?

android - 如何防止ViewModel再次触发我的加载栏

android - 如何使用流和协程在循环内收集数据

android - 错误 : cardElevation and cardUseCompatPadding not found

android - 错误 :layout bounds on right border must start at edge

Android Studio 创建项目生成带有垃圾字符的 colors.xml

kotlin - Ktor-静态内容路由

字符串模板中的可空变量

android-studio - 无法在 Android Studio 中找到 "Google Sceneform Tools (Beta)"插件

android - 更新 Android Studio 3.0 稳定更新后 Gradle Stuck 并花费很长时间