首页 > 解决方案 > 如何从 Kotlin 的 ListView 中找到选定的元素?

问题描述

我正在尝试制作一个获取联系人列表并将它们放入 ListView 的应用程序。我计划将电话号码保存到变量中,但现在我将它显示在 Toast 消息中,以便我可以确认该值是正确的。

AddNewAlarm.kt

package com.example.safetybuddy

import android.content.ContentResolver
import android.database.Cursor
import android.location.Location.convert
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.ContactsContract
import android.telephony.PhoneNumberUtils
import android.view.View
import android.widget.AdapterView
import android.widget.Button
import android.widget.SimpleCursorAdapter
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.get
import kotlinx.android.synthetic.main.activity_add_new_alarm.*
import kotlinx.android.synthetic.main.activity_users.*
import java.util.logging.Logger.global


class AddNewAlarm : AppCompatActivity() {

    @RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_add_new_alarm)

        // code to make the button work
        val button = findViewById<Button>(R.id.btnAdd)
        button.setOnClickListener{
            // populate the listView
            populate()
        }

        // get the number when an item is clicked
        listView.setOnItemClickListener{ _,_,pos,_ ->
            Toast.makeText(this, listView.getItemAtPosition(pos).toString(), Toast.LENGTH_SHORT).show()
        }

        }

    private fun populate(){

        // defines the columns
        var cols = listOf<String>(
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Phone._ID

        ).toTypedArray()

        var from = listOf<String>(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER).toTypedArray()

        var to = intArrayOf(android.R.id.text1, android.R.id.text2)

        var rs = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, cols, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME) // sorts by display name

        var adapter = SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, rs, from, to, 0)

        listView.adapter = adapter
    }
}

我能够填充 ListView,但是当我点击该项目时它不显示电话号码

标签: androidkotlin

解决方案


listview.getItemAtPosition(pos)返回CursorWrapper,您必须从中获取列值CursorWrapper

listView.setOnItemClickListener{ _,_,pos,_ ->
            val cw : CursorWrapper = listView.getItemAtPosition(pos) as CursorWrapper;
            val str: String = cw.getString(1);
            Toast.makeText(this, str, Toast.LENGTH_SHORT).show()
        }

推荐阅读