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

How to get the selected item from ListView in Kotlin?

代码示例:

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
        }
    }
}

我试图先了解列表视图而不是回收器视图以了解基础知识。 任何人都知道我们如何在选择或点击时获得所选行 id/index 值,以及如何在 kotlin 中对特定行的选择执行某些操作?

您可以在 getView() 方法内部使用如下内容:

view.setOnClickListener(object : View.OnClickListener {
    override fun onClick(v: View?) {
        //use getItem(position) to get the item
    }
})

或使用 lambda:

view.setOnClickListener({ v -> //use theItem(position) })

小提示:

I'm trying to understand list view instead of recycler view to understand basics first.

我认为在您的项目中,99% 的情况下您都会使用 RecyclerView

要填充列表视图,您必须有数据集。数据集可以是任何数据类型的列表,例如字符串,或者您可以使用模型列表 class。像这样:

这是我将在 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 的模型 class,其中包含 ID、标题及其状态。

现在让我们将其填充到 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
        }

希望您能理解这一点。

在你的oncreate()中添加OnItemClickListener

    listView.setOnItemClickListener{ parent, view, position, id -&gt;
        Toast.makeText(this, "You Clicked:"+" "+position,Toast.LENGTH_SHORT).show()
    }

在您的 CustomAdapter 中添加项目数组 class。

class CustomAdptor(private val context: Activity): BaseAdapter() {
//Array of fruits names
var names = arrayOf("Apple", "Strawberry", "Pomegranates", "Oranges", "Watermelon", "Bananas", "Kiwi", "Tomato", "Grapes")
//Array of fruits desc
var desc = arrayOf("Malus Domestica", "Fragaria Ananassa ", "Punica Granatum", "Citrus Sinensis", "Citrullus Vulgaris", "Musa Acuminata", "Actinidia Deliciosa", "Solanum Lycopersicum", "Vitis vinifera")

//Array of fruits images
var image = intArrayOf(R.drawable.apple, R.drawable.strawberry, R.drawable.pomegranates, R.drawable.oranges, R.drawable.watermelon, R.drawable.banana, R.drawable.kiwi, R.drawable.tomato, R.drawable.grapes)
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
    val inflater = context.layoutInflater
    val view1 = inflater.inflate(R.layout.row_data,null)
    val fimage = view1.findViewById(R.id.fimageView)
    var fName = view1.findViewById(R.id.fName)
    var fDesc = view1.findViewById(R.id.fDesc)
    fimage.setImageResource(image[p0])
    fName.setText(names[p0])
    fDesc.setText(desc[p0])
    return view1
}

override fun getItem(p0: Int): Any {
    return image[p0]
}

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

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

}

您可以在以下位置找到整个教程:listview with onItemClickListener using kotlin