web-dev-qa-db-fra.com

"Pas assez d'informations pour déduire le paramètre T" avec Kotlin et Android

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.

72
Timo Güntner

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)

6
Trinea

Ç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!

3
Keshav Gera

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 }**
    }
}
2
Alf Moh

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 ;)

0
pauminku