J'essaie de reproduire le ListView suivant dans mon application Android à l'aide de Kotlin: https://github.com/bidrohi/KotlinListView .
Malheureusement, j'obtiens une erreur que je ne parviens pas à résoudre moi-même ... Voici mon code:
MainActivity.kt:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val listView = findViewById(R.id.list) as ListView
listView.adapter = ListExampleAdapter(this)
}
private class ListExampleAdapter(context: Context) : BaseAdapter() {
internal var sList = arrayOf("Eins", "Zwei", "Drei")
private val mInflator: LayoutInflater
init {
this.mInflator = LayoutInflater.from(context)
}
override fun getCount(): Int {
return sList.size
}
override fun getItem(position: Int): Any {
return sList[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? {
val view: View?
val vh: ListRowHolder
if(convertView == null) {
view = this.mInflator.inflate(R.layout.list_row, parent, false)
vh = ListRowHolder(view)
view.tag = vh
} else {
view = convertView
vh = view.tag as ListRowHolder
}
vh.label.text = sList[position]
return view
}
}
private class ListRowHolder(row: View?) {
public val label: TextView
init {
this.label = row?.findViewById(R.id.label) as TextView
}
}
}
Les dispositions sont exactement comme ici: https://github.com/bidrohi/KotlinListView/tree/master/app/src/main/res/layout
Le message d'erreur complet que je reçois est le suivant: Erreur: (92, 31) Echec de l'inférence de type: informations insuffisantes pour déduire le paramètre T dans fun findViewById (p0: Int): T! Veuillez spécifier c'est explicitement.
J'apprécierais toute aide que je pourrais obtenir.
Andoid O changer findViewById api de
vue publique findViewById (int id);
à
public final T findViewById (int id)
donc, si vous êtes la cible de l'API 26, vous pouvez changer
val listView = findViewById (R.id.list) en tant que ListView
à
val listView = findViewById (R.id.list)
ou
val listView: ListView = findViewById (R.id.list)
Ça marche
API niveau 25 ou inférieur utiliser cette
var et_user_name = findViewById(R.id.et_user_name) as EditText
API niveau 26 ou supérieur utiliser cette
val et_user_name: EditText = findViewById(R.id.et_user_name)
Bon codage!
Changez votre code pour cela. Les principaux changements survenus sont signalés par des astérisques.
package com.phenakit.tg.phenakit
import Android.content.Context
import Android.os.Bundle
import Android.support.design.widget.BottomNavigationView
import Android.support.v7.app.AppCompatActivity
import Android.view.LayoutInflater
import Android.view.View
import Android.view.ViewGroup
import Android.widget.BaseAdapter
import Android.widget.ListView
import Android.widget.TextView
public class MainActivity : AppCompatActivity() {
private var mTextMessage: TextView? = null
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
when (item.itemId) {
R.id.navigation_home -> {
mTextMessage!!.setText(R.string.title_home)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_dashboard -> {
mTextMessage!!.setText(R.string.title_dashboard)
return@OnNavigationItemSelectedListener true
}
R.id.navigation_notifications -> {
setContentView(R.layout.activity_list_view)
return@OnNavigationItemSelectedListener true
}
}
false
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mTextMessage = findViewById(R.id.message) as TextView?
val navigation = findViewById(R.id.navigation) as BottomNavigationView
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
**val listView = findViewById<ListView>(R.id.list)**
**listView?.adapter = ListExampleAdapter(this)**
}
private class ListExampleAdapter(context: Context) : BaseAdapter() {
internal var sList = arrayOf("Eins", "Zwei", "Drei")
private val mInflator: LayoutInflater
init {
this.mInflator = LayoutInflater.from(context)
}
override fun getCount(): Int {
return sList.size
}
override fun getItem(position: Int): Any {
return sList[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? {
val view: View?
val vh: ListRowHolder
if(convertView == null) {
view = this.mInflator.inflate(R.layout.list_row, parent, false)
vh = ListRowHolder(view)
view.tag = vh
} else {
view = convertView
vh = view.tag as ListRowHolder
}
vh.label.text = sList[position]
return view
}
}
private class ListRowHolder(row: View?) {
public var label: TextView
**init { this.label = row?.findViewById<TextView?>(R.id.label) as TextView }**
}
}
Je vous suggère d'utiliser synthetics
kotlin extension Android:
https://kotlinlang.org/docs/tutorials/Android-plugin.html
https://antonioleiva.com/kotlin-Android-extensions/
Dans votre cas, le code ressemblera à ceci:
init {
this.label = row.label
}
Aussi simple que cela ;)