Android 游标返回错误的联系人id

Android 游标返回错误的联系人id,android,android-fragments,kotlin,androidx,android-cursor,Android,Android Fragments,Kotlin,Androidx,Android Cursor,我有一个获得联系人名单和联系方式的应用程序。所有数据都显示在两个片段中。主要片段是包含联系人列表。当我点击某个项目时,它会返回联系人的id。如果我选择列表的第一个项目,一切都是正确的,但是如果我选择了另一个联系人,它会返回错误的id override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { (parent?.adapter as? CursorAd

我有一个获得联系人名单和联系方式的应用程序。所有数据都显示在两个片段中。主要片段是包含联系人列表。当我点击某个项目时,它会返回联系人的id。如果我选择列表的第一个项目,一切都是正确的,但是如果我选择了另一个联系人,它会返回错误的id

override fun onItemClick(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
        (parent?.adapter as? CursorAdapter)?.cursor?.apply {
            moveToPosition(position)
            val contactId = getLong(CONTACT_ID_INDEX)

            startActivity(Intent(activity, DetailedActivity::class.java).also {
                it.putExtra(SELECTED_CONTACT_INDEX, contactId)
            })
        }
    } 
mclick(父对象:AdapterView?,视图:view?,位置:Int,id:Long){
(父?适配器作为?游标或适配器)?。游标?应用{
移动位置(位置)
val contactId=getLong(联系人ID索引)
startActivity(Intent(activity,DetailedActivity::class.java){
it.putExtra(所选联系人索引、联系人ID)
})
}
} 
这是ContactLoader类的列表:

class ContactLoader(private val context: FragmentActivity?) : LoaderManager.LoaderCallbacks<Cursor> {

    private var cursorAdapter: SimpleCursorAdapter? = null

    private val fromColumns: Array<String> = arrayOf(
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY,
        ContactsContract.CommonDataKinds.Phone.NUMBER
    )

    private val toIds = intArrayOf(
        R.id.contact_name,
        R.id.contact_phone
    )

    private val projection: Array<out String> = arrayOf(
        ContactsContract.CommonDataKinds.Phone._ID,
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY,
        ContactsContract.CommonDataKinds.Phone.NUMBER
    )

    fun initContactLoader() {

        cursorAdapter = context?.let {
            LoaderManager.getInstance(it).initLoader(0, null, this)

            SimpleCursorAdapter(
                it,
                R.layout.contact_list_item,
                null,
                fromColumns, toIds,
                0
            )
        }
    }

    fun getAdapter() = cursorAdapter

    override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> = context?.let {
        CursorLoader(
            it,
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            projection,
            null,
            null,
            sortOrder
        )
    } ?: throw IllegalStateException()

    override fun onLoadFinished(loader: Loader<Cursor>, data: Cursor?) {
        cursorAdapter?.swapCursor(data)
    }

    override fun onLoaderReset(loader: Loader<Cursor>) {
        cursorAdapter?.swapCursor(null)
    }

    companion object {
        private const val sortOrder: String =
            "${ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY} ASC"
    }

}
类ContactLoader(私有val上下文:FragmentActivity?):LoaderManager.LoaderCallbacks{
私有变量cursorAdapter:SimpleCursorAdapter?=null
private val fromColumns:Array=arrayOf(
Contacts contract.CommonDataTypes.Phone.DISPLAY\u NAME\u PRIMARY,
Contacts contract.CommonDataTypes.Phone.NUMBER
)
私有值toIds=intArrayOf(
R.id.联系人姓名,
联系电话
)
私有值投影:Array=arrayOf(
Contacts contract.CommonDataTypes.Phone.\u ID,
Contacts contract.CommonDataTypes.Phone.DISPLAY\u NAME\u PRIMARY,
Contacts contract.CommonDataTypes.Phone.NUMBER
)
有趣的initContactLoader(){
cursorAdapter=context?让{
LoaderManager.getInstance(it).initLoader(0,null,this)
简单自适应(
信息技术
R.layout.contact\u list\u项目,
无效的
fromColumns,ToId,
0
)
}
}
fun getAdapter()=游标适配器
重写FunonCreateLoader(id:Int,args:Bundle?):Loader=context?.let{
游标装载机(
信息技术
ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,
投影,
无效的
无效的
排序器
)
}?:抛出IllegalStateException()
覆盖乐趣onLoadFinished(加载程序:加载程序,数据:光标?){
游标适配器?.swapCursor(数据)
}
覆盖有趣的onLoaderReset(加载程序:加载程序){
游标适配器?.swapCursor(空)
}
伴星{
private const val sortOrder:字符串=
“${ContactsContract.CommonDataTypes.Phone.DISPLAY\u NAME\u PRIMARY}ASC”
}
}

解决方案:我忘了将contacts contract.commondatatypes.Phone.CONTACT\u ID添加到投影中。添加后,我得到了正确的id,所有详细信息都显示正确


另外,我还将常数CONTACT\u ID\u索引从0更改为1

解决方案:我忘了将contacts contract.commondatatypes.Phone.CONTACT\u ID添加到投影中。添加后,我得到了正确的id,所有详细信息都显示正确

另外,我还将常数CONTACT_ID_索引从0更改为1